场合
我认为这很容易 - 但事实证明有一些限制。 我有一个空数组,此时它是空的并且尺寸未知。
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的变量
答案 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
。
数组的目的是提前创建正确的大小,并且永远不会改变大小。功能确实存在,但它首先绕过了使用numpy数组的一些优点。