初始化numpy数组

190 投票
14 回答
822703 浏览
提问于 2025-04-16 09:04

有没有办法初始化一个特定形状的numpy数组,并且可以往里面添加内容?我用一个列表的例子来说明。如果我想在一个循环中创建一个对象的列表,我可以这样做:

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

我想用numpy数组做类似的事情。我知道有vstack、concatenate等方法。不过,这些方法似乎都需要两个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的大小。在这个例子中,我知道大小,但如果我不知道呢?在Python中使用.append函数扩展列表时,我们不需要提前知道它的最终大小。我想知道是否有类似的方法,可以从小数组创建一个更大的数组,从一个空数组开始。

14 个回答

36

在numpy 1.8中引入了:

numpy.full

这个函数会返回一个新的数组,数组的形状和类型都是你指定的,并且里面的内容都是用你给定的填充值填满的。

举个例子:

>>> 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]])
52

我通常的做法是先创建一个普通的列表,然后把我的东西添加进去,最后再把这个列表转换成一个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()创建数组也很快。

216

numpy.zeros

这个函数会返回一个新的数组,里面的内容都是零,形状和类型都是你指定的。

或者

numpy.ones

这个函数会返回一个新的数组,里面的内容都是一,形状和类型也是你指定的。

或者

numpy.empty

这个函数会返回一个新的数组,形状和类型是你指定的,但里面的内容没有被初始化,也就是说里面的值是随机的。


不过,在使用numpy时,我们通常不会像在普通列表中那样一个个添加元素来构建数组,因为这样效率不高(numpy的数据类型更接近底层的C语言数组)。相反,你应该先预留好需要的数组大小,然后再填充内容。如果真的需要的话,你可以使用numpy.append来添加元素。

撰写回答