初始化一个numpy数组

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

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

我想要做一个类似于一个numpy数组的东西。 我知道vstack,连接等。但是,这似乎需要两个numpyarrays作为input。 我需要的是:

 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列表时,我们不需要事先知道它的最终大小。 我想知道是否有类似的东西存在从较小的数组创build一个更大的数组,从一个空数组开始。

numpy.zeros

返回给定形状和types的新数组,填充零。

要么

numpy.ones

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

要么

numpy.empty

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


然而,我们通过将元素附加到列表来构build数组的想法在numpy中并没有太多用处,因为效率较低(numpy数据types更接近底层C数组)。 相反,您应该预先分配数组的大小,你需要它,然后填写行。 numpy.append如果必须,您可以使用numpy.append

我通常这样做的方式是创build一个常规列表,然后添加我的东西,最后将列表转换为一个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 

当然你的最终对象在创build步骤中占用内存空间的两倍,但是在python列表上追加速度非常快,而且使用np.array()也是创build的。

数组模拟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) 

numpy.fromiter()是你在找什么:

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

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

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

如果事先知道数组的长度,可以使用可选的“count”参数来指定它。

对于你的第一个数组示例使用,

 a = numpy.arange(5) 

要初始化big_array,请使用

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

这假设你想用零初始化,这是非常典型的,但有很多其他的方法来初始化numpy数组 。

编辑:如果您事先不知道big_array的大小,通常最好先使用append创build一个Python列表,当您将列表中的所有东西都收集到列表中时,使用numpy.array(mylist) 。 这样做的原因是列表是为了非常有效和快速地增长,而numpy.concatenate将是非常低效的,因为numpy数组不会轻易改变大小。 但是,一旦所有东西都被收集到一个列表中,并且您知道最终的数组大小,则可以有效地构造一个numpy数组。

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

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

编辑:你正在做什么样的序列? 你应该检查出创build数组的不同的numpy函数,比如numpy.linspace(start, stop, size)numpy.arange(start, stop, inc) ),或者numpy.arange(start, stop, inc) 。 在可能的情况下,这些函数会使数组比在显式循环中执行相同的工作快得多

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

 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是完全安全的,因为你保证整个数组将被填充你生成的块。

在numpy 1.8中引入:

numpy.full

返回给定形状和types的新数组,填充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]]) 

我build议先定义形状。 然后遍历它来插入值。

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

每当你处于以下情况时:

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

而且你需要在numpy中类似的东西,以前的几个答案已经指出了做这件事的方法,但是@katrielalex指出这些方法效率不高。 这样做的有效方法是build立一个长列表,然后在列表很长的时候以你想要的方式重新构build它。 例如,假设我正在读取文件中的某些行,并且每行都有一个数字列表,并且我想要构build一个形状的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