初始化一个numpy数组

时间:2010-12-26 20:52:45

标签: python arrays numpy

有没有办法初始化一个形状的numpy数组并添加到它?我将用列表示例解释我需要什么。如果我想创建循环中生成的对象列表,我可以这样做:

a = []
for i in range(5):
    a.append(i)

我想用numpy数组做类似的事情。我知道vstack,连接等等。但是,似乎这些需要两个numpy数组作为输入。我需要的是:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

big_array的形状应为(10,4)。怎么做?


修改

我想补充以下说明。我知道我可以定义big_array = numpy.zeros((10,4))然后填写它。但是,这需要提前指定big_array的大小。我知道这种情况下的大小,但如果我不知道怎么办?当我们使用.append函数在python中扩展列表时,我们不需要事先知道它的最终大小。我想知道是否存在类似的东西,从较小的数组创建一个更大的数组,从一个空数组开始。

13 个答案:

答案 0 :(得分:130)

  

numpy.zeros

     

返回给定形状的新数组   类型,填充零。

  

numpy.ones

     

返回给定形状的新数组   类型,充满了。

  

numpy.empty

     

返回给定形状的新数组   输入,而不初始化条目。


然而,我们通过将元素附加到列表来构造数组的心态在numpy中使用不多,因为它效率较低(numpy数据类型更接近底层C数组)。相反,您应该将数组预先分配到您需要的大小,然后填写行。但是,如果必须,可以使用numpy.append

答案 1 :(得分:37)

我通常这样做的方法是创建一个常规列表,然后将我的东西添加到其中,最后将列表转换为numpy数组,如下所示:

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
    arr = i*np.ones((2,4)) # for instance
    big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

当然你的最终对象在创建步骤中占用了内存空间的两倍,但是在python列表上附加非常快,并且使用np.array()创建也是如此。

答案 2 :(得分:12)

在numpy 1.8中引入:

  

numpy.full

     

返回一个给定形状和类型的新数组,填充fill_value。

示例:

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
       [ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
       [10, 10]])

答案 3 :(得分:10)

python的数组模拟

a = []
for i in range(5):
    a.append(i)

是:

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)

答案 4 :(得分:7)

您正在寻找

numpy.fromiter()

big_array = numpy.fromiter(xrange(5), dtype="int")

它也适用于生成器表达式,例如:

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

如果您事先知道阵列的长度,可以使用可选的'计数'来指定它。参数。

答案 5 :(得分:6)

在进行数组计算时,您确实希望尽可能避免显式循环,因为这会降低这种计算形式的速度增益。有多种方法可以初始化numpy数组。如果你想要它填充零,请像katrielalex说:

big_array = numpy.zeros((10,4))

编辑:你正在制作什么样的序列?您应该查看创建数组的不同numpy函数,例如numpy.linspace(start, stop, size)(等间距数字)或numpy.arange(start, stop, inc)。在可能的情况下,这些函数将使数组比在显式循环中执行相同的工作快得多

答案 6 :(得分:5)

使用第一个数组示例

a = numpy.arange(5)

要初始化big_array,请使用

big_array = numpy.zeros((10,4))

这假设您要使用零进行初始化,这很常见,但还有许多其他ways to initialize an array in numpy

修改 如果您事先不知道big_array的大小,通常最好先使用append构建Python列表,当您在列表中收集了所有内容时,使用{将此列表转换为numpy数组{1}}。这样做的原因是列表意味着非常有效和快速地增长,而numpy.concatenate效率非常低,因为numpy数组不会轻易改变大小。但是一旦在列表中收集了所有内容,并且您知道最终的数组大小,就可以有效地构造一个numpy数组。

答案 7 :(得分:3)

每当您遇到以下情况时:

a = []
for i in range(5):
    a.append(i)

并且你想要类似于numpy的东西,之前的几个答案都指出了这样做的方法,但正如@katrielalex所指出的那样,这些方法效率不高。执行此操作的有效方法是构建一个长列表,然后在列出长列表后以您希望的方式重新整形。例如,让我说我正在从文件中读取一些行,每行都有一个数字列表,我想构建一个numpy形状的数组(读取的行数,每行中的向量长度)。以下是我如何更有效地做到这一点:

long_list = []
counter = 0
with open('filename', 'r') as f:
    for row in f:
        row_list = row.split()
        long_list.extend(row_list)
        counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array

答案 8 :(得分:3)

import numpy as np

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

print mat.shape
print mat

输出:

(5, 5)
[[1 1 0 0 0]
 [0 1 0 0 1]
 [1 0 0 1 1]
 [0 0 0 0 0]
 [1 0 1 0 1]]

答案 9 :(得分:2)

我意识到这有点晚了,但我没有注意到任何其他答案提到索引到空数组:

big_array = numpy.empty(10, 4)
for i in range(5):
    array_i = numpy.random.random(2, 4)
    big_array[2 * i:2 * (i + 1), :] = array_i

这样,您可以使用numpy.empty预先分配整个结果数组,并在使用索引分配时填写行。

在您提供的示例中,使用empty而不是zeros预分配是完全安全的,因为您保证整个数组将填充您生成的块。

答案 10 :(得分:1)

我建议先定义形状。 然后迭代它以插入值。

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
    big_array[it] = (it,it) # For example

>>>big_array

array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.],
       [ 5.,  5.]])

答案 11 :(得分:1)

也许这样的事情符合你的需求..

import numpy as np

N = 5
res = []

for i in range(N):
    res.append(np.cumsum(np.ones(shape=(2,4))))

res = np.array(res).reshape((10, 4))
print(res)

产生以下输出

[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]

答案 12 :(得分:0)

如果你想在多维数组中添加你的项目,这里是解决方案。

import numpy as np
big_array = np.ndarray(shape=(0, 2, 4) # Empty with height and width 2, 4 and length 0

for i in range(5):
    big_array = np.concatenate((big_array, i))

这是 numpy official document for referral