具有不同形状元素的numpy.array
我想要创建一个包含两个不同形状数组的numpy数组。根据我的了解,为了实现这个目标,定义主数组时需要使用:dtype = object
。
比如,我们可以在Python 2.7中这样定义我们的数组:
a0 = np.arange(2*2).reshape(2,2)
a1 = np.arange(3*3*2).reshape(3,3,2)
b = np.array([a0,a1], dtype = object)
这样做是完全没问题的:b[1]
和a1
是一样的。但是如果我把a0
的维度从(2,2)改成(3,3),就会出现一些奇怪的情况:
a0 = np.arange(3*3).reshape(3,3)
a1 = np.arange(3*3*2).reshape(3,3,2)
b = np.array([a0,a1], dtype = object)
这次b[1]
和a1
就不相等了,它们甚至有不同的形状。这种奇怪的行为是什么原因呢?
也许还有其他完全不同的解决方案。但我不想使用列表或元组,因为我希望能够进行像b + b
这样的加法。显然,我可以为这个目的写一个自己的类,但有没有更简单的方法呢?
2 个回答
3
我觉得这并不是奇怪的行为,反而是你使用numpy的方式让我觉得有点奇怪。
numpy会尽量合并维度。这是它的默认行为,也是处理数组时的预期效果。在第一个例子中,a0
和a1
的所有维度都不一样,所以numpy只能使用第一个维度。因此,如果我们查看第一个例子中的b.shape
,会看到(2,)
。
在第二个例子中,a0
和a1
的维度大小一直到最后一个维度都是相同的。所以numpy会把这些维度合并在一起。如果你查看这里的b.shape
,会看到(2,3,3)
,因为第二个和第三个维度的大小是一样的。
9
如果你想要一个专门用来存放对象的数组,首先可以创建一个空的对象数组,然后把它赋值给这个数组:
x = empty(5, dtype=object)
x[0] = zeros((3,3))
x[1] = zeros((3,2)) #does not merge axes.
x[2] = eye(4)
x[3] = ones((2,2))*2
x[4] = arange(10).reshape((5,2))
>>> x+x
array([array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]),
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]]),
array([[ 2., 0., 0., 0.],
[ 0., 2., 0., 0.],
[ 0., 0., 2., 0.],
[ 0., 0., 0., 2.]]),
array([[ 4., 4.],
[ 4., 4.]]),
array([[ 0, 2],
[ 4, 6],
[ 8, 10],
[12, 14],
[16, 18]])], dtype=object)
在你进行数学运算之前,必须先把所有的元素填充完整,或者可以使用np.append这个方法来把数组的大小从零增加。