如何堆叠形状为(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
工作正常,但沿着错误的尺寸符连接。
如何堆叠形状为(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
工作正常,但沿着错误的尺寸符连接。
简答:你不行。 NumPy本身不支持锯齿状数组。
龙答:
>>> a = ones((3,))
>>> b = ones((2,))
>>> c = array([a, b])
>>> c
array([[ 1. 1. 1.], [ 1. 1.]], dtype=object)
给出可能会或可能不会表现为你所期望的数组。例如。它不支持像sum
或reshape
这样的基本方法,您应该像对待普通Python列表[a, b]
(迭代它来执行操作而不是使用向量化成语)那样对待它。
存在几种可能的解决方法;最简单的办法是强制a
和b
达到一个共同长度,也许使用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
也很有趣。)
一般来说,将不同长度的数组放在一起是模糊的,因为数据的对齐可能很重要。 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]])
为了增加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
当然必须有办法!如果numpy中的1维数组只是存储指向其他多维数组的对象指针,那么为什么多维数组必须是相同的?当然不是?帮助赞赏。 – CodeCabbie 2017-04-27 13:42:14