如何在NumPy中堆叠不同长度的向量?

mac*_*389 26 python numpy

如何堆叠n形状的矢量形状(x,),其中x可以是任意数字?

例如,

from numpy import *
a = ones((3,))
b = ones((2,))

c = vstack((a,b)) # <-- gives an error
c = vstack((a[:,newaxis],b[:,newaxis])) #<-- also gives an error
Run Code Online (Sandbox Code Playgroud)

hstack 工作正常,但在错误的维度上连接.

Fre*_*Foo 31

简短的回答:你做不到.NumPy本身不支持锯齿状数组.

答案很长:

>>> a = ones((3,))
>>> b = ones((2,))
>>> c = array([a, b])
>>> c
array([[ 1.  1.  1.], [ 1.  1.]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

给出一个可能会或可能不会按预期运行的数组.例如,它不支持像sum或的基本方法reshape,你应该对待这一点,因为你会对待普通的Python列表[a, b](迭代它来执行操作而不是使用矢量化的习语).

存在几种可能的解决方法; 最简单的是强制ab共同长度,可能使用掩码数组或NaN来表示某些索引在某些行中无效.例如,这b是一个蒙面数组:

>>> ma.array(np.resize(b, a.shape[0]), mask=[False, False, True])
masked_array(data = [1.0 1.0 --],
             mask = [False False  True],
       fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)

这可以堆叠a如下:

>>> ma.vstack([a, ma.array(np.resize(b, a.shape[0]), mask=[False, False, True])])
masked_array(data =
 [[1.0 1.0 1.0]
 [1.0 1.0 --]],
             mask =
 [[False False False]
 [False False  True]],
       fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)

(出于某些目的,scipy.sparse也可能很有趣.)

  • 要添加到larsmans的解决方案中,以查找最大的“锯齿状”数组,可以使用max_entries = max([[len,x)for [a,b]]中的x),并自动生成掩码,使用`np.concatenate([np.zeros(len(b),dtype = bool),np.ones(max_entries-len(b),dtype = bool)]))。 (2认同)

Vin*_*ooo 5

通常,将不同长度的数组放在一起会有歧义,因为数据的对齐可能很重要。Pandas有不同的高级解决方案可以解决此问题,例如将系列合并到dataFrames中。

如果您只想从第一个元素开始填充列,那么我通常要做的是建立一个矩阵并填充列。当然,您需要使用空值填充矩阵中的空白空间(在这种情况下np.nan

a = ones((3,))
b = ones((2,))
arraylist=[a,b]

outarr=np.ones((np.max([len(ps) for ps in arraylist]),len(arraylist)))*np.nan #define empty array
for i,c in enumerate(arraylist):  #populate columns
    outarr[:len(c),i]=c

In [108]: outarr
Out[108]: 
array([[  1.,   1.],
       [  1.,   1.],
       [  1.,  nan]])
Run Code Online (Sandbox Code Playgroud)