具有不同形状元素的numpy.array

8 投票
2 回答
11346 浏览
提问于 2025-04-28 10:14

我想要创建一个包含两个不同形状数组的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会尽量合并维度。这是它的默认行为,也是处理数组时的预期效果。在第一个例子中,a0a1的所有维度都不一样,所以numpy只能使用第一个维度。因此,如果我们查看第一个例子中的b.shape,会看到(2,)

在第二个例子中,a0a1的维度大小一直到最后一个维度都是相同的。所以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这个方法来把数组的大小从零增加。

撰写回答