有没有办法初始化一个形状的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中扩展列表时,我们不需要事先知道它的最终大小。我想知道是否存在类似的东西,从较小的数组创建一个更大的数组,从一个空数组开始。
答案 0 :(得分:130)
返回给定形状的新数组 类型,填充零。
或
返回给定形状的新数组 类型,充满了。
或
返回给定形状的新数组 输入,而不初始化条目。
然而,我们通过将元素附加到列表来构造数组的心态在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中引入:
返回一个给定形状和类型的新数组,填充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.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