簡體   English   中英

如何在Python中創建整數數組?

[英]How to create an integer array in Python?

它不應該那么難。 我的意思是在C,

int a[10]; 

是你所需要的全部。 如何為隨機大小創建全零的數組。 我知道NumPy中的零()函數,但必須有一個簡單的內置方法,而不是另一個模塊。

兩種方式:

x = [0] * 10
x = [0 for i in xrange(10)]

編輯:用xrange替換range以避免創建另一個列表。

另外:正如許多人已經注意到包括Pi和Ben James,這創建了一個list ,而不是Python數組。 雖然列表在許多情況下足夠且容易,但對於性能關鍵用途(例如,當在數千個對象中重復時),您可以查看python數組。 查找array模塊,如本主題中的其他答案所述。

如果您對列表不滿意(因為它們可以包含任何內容並占用太多內存),您可以使用有效的整數數組:

import array
array.array('i')

看到這里

如果你需要初始化它,

a = array.array('i',(0 for i in range(0,10)))
>>> a = [0] * 10
>>> a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

使用陣列模塊。 有了它,您可以有效地存儲相同類型的集合。

>>> import array
>>> import itertools
>>> a = array_of_signed_ints = array.array("i", itertools.repeat(0, 10))

有關更多信息 - 例如不同類型,請查看陣列模塊的文檔 對於多達100萬個條目,這應該感覺非常活潑。 對於1000萬個條目,我的本地機器認為1.5秒。

array.array的第二個參數是一個生成器 ,它在讀取時構造定義的序列。 這樣,陣列模塊可以逐個消耗零,但生成器只使用常量內存。 如果序列變長,這個生成器不會變大(內存方面)。 陣列當然會增長,但這應該是顯而易見的。

你就像列表一樣使用它:

>>> a.append(1)
>>> a.extend([1, 2, 3])
>>> a[-4:]
array('i', [1, 1, 2, 3])
>>> len(a)
14

...或者只是將其轉換為列表:

>>> l = list(a)
>>> len(l)
14

出奇

>>> a = [0] * 10000000

在構造上比陣列方法更快。 去搞清楚! :)

a = 10 * [0]

給你一個長度為10的數組,用零填充。

import random

def random_zeroes(max_size):
  "Create a list of zeros for a random size (up to max_size)."
  a = []
  for i in xrange(random.randrange(max_size)):
    a += [0]

如果您使用的是Python 3.x,請使用range

如果你需要快速初始化一個數組,你可以用塊而不是生成器初始化器來完成它,它會更快。 [0]*count創建列表同樣快。

import array

def zerofill(arr, count):
    count *= arr.itemsize
    blocksize = 1024
    blocks, rest = divmod(count, blocksize)
    for _ in xrange(blocks):
        arr.fromstring("\x00"*blocksize)
    arr.fromstring("\x00"*rest)

def test_zerofill(count):
    iarr = array.array('i')
    zerofill(iarr, count)
    assert len(iarr) == count

def test_generator(count):
    iarr = array.array('i', (0 for _ in xrange(count)))
    assert len(iarr) == count

def test_list(count):
    L = [0]*count
    assert len(L) == count

if __name__ == '__main__':
    import timeit
    c = 100000
    n = 10
    print timeit.Timer("test(c)", "from __main__ import c, test_zerofill as test").repeat(number=n)
    print timeit.Timer("test(c)", "from __main__ import c, test_generator as test").repeat(number=n)
    print timeit.Timer("test(c)", "from __main__ import c, test_list as test").repeat(number=n)

結果:

(array in blocks) [0.022809982299804688, 0.014942169189453125, 0.014089107513427734]
(array with generator) [1.1884641647338867, 1.1728270053863525, 1.1622772216796875]
(list) [0.023866891860961914, 0.035660028457641602, 0.023386955261230469]
import numpy as np

new_array=np.linspace(0,10,11).astype('int')

在制作陣列時轉換類型的替代方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM