如何在Python中创建整数数组?

时间:2009-12-07 13:08:32

标签: python arrays

不应该这么难。我的意思是在C,

int a[10]; 

就是你所需要的。如何为随机大小创建全零的数组。我知道NumPy中的零()函数,但必须有一个简单的内置方法,而不是另一个模块。

8 个答案:

答案 0 :(得分:26)

两种方式:

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

修改:将range替换为xrange以避免创建其他列表。

另外:正如许多其他人所说,包括Pi和Ben James,这会创建一个list,而不是Python数组。虽然列表在很多情况下足够且容易,但对于性能关键用途(例如,当在数千个对象中重复时),您可以查看python数组。查找array模块,如本主题中的其他答案中所述。

答案 1 :(得分:24)

如果您对列表不满意(因为它们可以包含任何内容并占用太多内存),您可以使用高效的整数数组:

import array
array.array('i')

请参阅here

如果您需要初始化它,

a = array.array('i',(0 for i in range(0,10)))

答案 2 :(得分:7)

>>> a = [0] * 10
>>> a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

答案 3 :(得分:6)

使用阵列模块。有了它,您可以有效地存储相同类型的集合。

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

有关更多信息 - 例如不同的类型,请看the documentation of the array module。对于多达100万个条目,这应该感觉非常活泼。对于1000万个条目,我的本地机器认为1.5秒。

array.array 的第二个参数是 generator ,它在读取时构造定义的序列。这样,阵列模块可以逐个消耗零,但生成器只使用常量内存。如果序列变长,这个生成器不会变大(内存方面)。阵列当然会增长,但这应该是显而易见的。

您就像列表一样使用它:

>>> 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

构造比阵列方法更快。去搞清楚! :)

答案 4 :(得分:1)

a = 10 * [0]

给你一个长度为10的数组,用零填充。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

如果需要快速初始化数组,可以通过块而不是使用生成器初始化器来完成,并且它会更快。按[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]

答案 7 :(得分:0)

import numpy as np

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

在创建数组时强制转换类型的替代方法。