如何将N-Length的numpy数组附加到另​​一个N维数组?

时间:2016-10-18 16:06:09

标签: python arrays numpy

场合

我认为这很容易 - 但事实证明有一些限制。 我有一个空数组,此时它是空的并且尺寸未知。

mainArray = np.array([])

稍后,我想将数组追加到我的主数组中,这些数组的长度不同。

我试过

*请假设我尝试追加的所有数组都是np.zeros(n)

的结果

我尝试了np.append(),但这并没有保持正确的尺寸(假设我想要一个线性数组)。

我已尝试过np.concatenate(),但此错误

TypeError: only length-1 arrays can be converted to Python scalars

暗示我无法连接到空数组......?

我尝试了np.vstack()但是

ValueError: all the input array dimensions except for the concatenation axis must match exactly

...这意味着我不能添加不同长度的数组?

问题

如何将n长度数组附加到空的n维数组?

更新

以下是输出示例:

[[0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0]]

长度为3的变量

2 个答案:

答案 0 :(得分:4)

您的起始数组不为空(好吧,它确实有0个元素),而不是未知的维度。它具有明确的形状和维数(1d)。

In [704]: a=np.array([])
In [705]: a.shape
Out[705]: (0,)
In [706]: a.ndim
Out[706]: 1

有关使用a

的连接的一些示例
In [708]: np.concatenate((a,a,a,a)).shape
Out[708]: (0,)
In [709]: np.concatenate((a,np.zeros(3))).shape
Out[709]: (3,)

作为一般规则,不要以“空白”开头。数组并尝试重复追加。这是一种list方法,对数组效率不高。而且由于维度问题,可能无效。

执行重复追加的正确方法如下:

alist = []
for i in range(3):
     alist.append([1,2,3])
np.array(alist)

子列表的长度是否相同?在上一个示例中,它们不同,阵列版本为dtype=object。它是1d,指向列表中的其他内容 - 即荣耀列表。

In [710]: np.array([[0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0]])
Out[710]: array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0]], dtype=object)

这与3个相同长度的数组vstack得到的结果完全不同。

我认为你需要更多练习基本数组构造,以及shape和维度的含义。标题本身显示出一些混淆 - array of length N array of N-dimensions。这些是非常不同的描述。

============

concatenate的基本要点是(n1,m)数组可以与(n2,m)数组连接以生成(n1+n2,m)数组。其他方面也是如此。如果一个数组是1d (m,),则需要将其扩展为(1,m)以执行此连接。 vstack为您做了这种扩展。

这意味着(0,)形状数组可以与其他1d数组水平连接,但除了(n2,0)数组外,不能参与2d垂直连接。维度的大小可能为0,但这很少有用,因为它不包含任何数据。

答案 1 :(得分:1)

numpy的ndarray的一个关键概念是它是矩形的:给定深度的所有元素都具有相同的长度。这允许将每个维度中的位置元组的简单索引映射到单个平面阵列上:

array[x,y,z] #where array.shape = (a,b,c)
#is equivalent to:
array.flat[b*c*x + c*y + z]

对于许多算法,这允许在c中非常快速有效地操作。

Numpy在技术上支持您想要做的事情,但实现基本上将功能还原为本机列表。使用numpy的方法是指定数组dtype=object

; TLDR

数组的目的是提前创建正确的大小,并且永远不会改变大小。功能确实存在,但它首先绕过了使用numpy数组的一些优点。