将numpy.array附加到存储在列表中的某个numpy.array

时间:2017-04-05 16:43:33

标签: python arrays list numpy

我已经花了好几个小时才明白为什么我无法做到这一点:

>>> import numpy as np
>>> a = [np.empty((0,78,3)) for i in range(2)]
>>> b = np.random.randint(10,size=(1,78,3))
>>> a[0] = np.append(a[0],[b],axis=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 5003, in append
    return concatenate((arr, values), axis=axis)
ValueError: all the input arrays must have same number of dimensions
>>> 

a是一个带有空的numpy数组形状的列表(0,78,3)

b是一个随机的numpy.array形状(1,78,3)

然后我尝试将b追加到a[0] ...但由于没有相同的维度,这似乎不可能吗?..我不知道这里的问题是什么..如果我删除列表部分它会工作,那么为什么不用列表?..

2 个答案:

答案 0 :(得分:0)

您不是追加b而是追加[b]。这不起作用。

因此,为了追加b,请使用

a[0] = np.append(a[0],b,axis=0)

答案 1 :(得分:0)

远离np.append。学习正确使用np.concatenate。这个追加只会造成混乱。

根据您的定义,这有效:

In [20]: a1 = [np.concatenate((i,b),axis=0) for i in a]
In [21]: [i.shape for i in a1]
Out[21]: [(1, 78, 3), (1, 78, 3)]
In [22]: a
Out[22]: 
[array([], shape=(0, 78, 3), dtype=float64),
 array([], shape=(0, 78, 3), dtype=float64)]
In [23]: b.shape
Out[23]: (1, 78, 3)
In [24]: a1 = [np.concatenate((i,b),axis=0) for i in a]
In [25]: [i.shape for i in a1]
Out[25]: [(1, 78, 3), (1, 78, 3)]

A(0,78,3)可以在轴0上与(1,78,3)数组连接,产生另一个(1,78,3)数组。

但为什么呢?它只列出了2份b的副本。

c = [b,b]

这样做也很简单。

如果必须收集许多形状阵列(78,3),请执行

alist = []
for _ in range(n):
   alist.append(np.ones((78,3)))

生成的n个数组列表可以转换为带

的数组
np.array(alist)   # (n, 78, 3) array

或者如果你收集一个(1,78,3)数组的列表,np.concatenate(alist, axis=0)会将它们加入到(n,78,3)数组中。