2013-02-16 238 views
14

如何堆叠形状为(x,)的列向量n向量,其中x可以是任何数字?如何在NumPy中堆叠不同长度的向量?

例如,

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 

hstack工作正常,但沿着错误的尺寸符连接。

回答

21

简答:你不行。 NumPy本身不支持锯齿状数组。

龙答:

>>> a = ones((3,)) 
>>> b = ones((2,)) 
>>> c = array([a, b]) 
>>> c 
array([[ 1. 1. 1.], [ 1. 1.]], dtype=object) 

给出可能会或可能不会表现为你所期望的数组。例如。它不支持像sumreshape这样的基本方法,您应该像对待普通Python列表[a, b](迭代它来执行操作而不是使用向量化成语)那样对待它。

存在几种可能的解决方法;最简单的办法是强制ab达到一个共同长度,也许使用masked arrays或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) 

这可以用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) 

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

+0

为了增加larsmans的解决方案,以找到最大的‘锯齿’阵列,你可以使用' max_entries = max([len(x)for x in [a,b]])',并自动生成掩码,使用'np.concatenate([len(b),dtype = bool),np .ones(max_entries-len(b),dtype = bool)])'。 – 2014-05-23 22:45:44

+0

当然必须有办法!如果numpy中的1维数组只是存储指向其他多维数组的对象指针,那么为什么多维数组必须是相同的?当然不是?帮助赞赏。 – CodeCabbie 2017-04-27 13:42:14

3

一般来说,将不同长度的数组放在一起是模糊的,因为数据的对齐可能很重要。 Pandas有不同的高级解决方案来处理这个问题,例如,将系列合并到dataFrame中。

如果你只是想从第一个元素开始填充列,我通常做的是构建一个矩阵并填充列。当然,你需要填写一个空值矩阵中的空白空间(在这种情况下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]]) 
相关问题