numpy.array与不同形状的元素

时间:2014-10-19 17:05:50

标签: python arrays numpy

我想拥有另外两个阵列的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 个答案:

答案 0 :(得分:3)

我不认为这是一种奇怪的行为,这就是你使用numpy的方式,这对我来说很奇怪。

numpy尽可能多地合并维度。这是默认行为,是使用数组时的预期行为。在第一个示例中,a0a1的所有维度都不同。 numpy被迫只使用第一个维度。因此,如果我们在第一个示例中查看b.shape,我们就会看到(2,)

在第二个示例中,a0a1具有相同的尺寸大小,一直到最后一个尺寸。 numpy合并了这些级别。如果您在此处查看b.shape,则会看到(2,3,3),因为第二维和第三维的大小相同。

答案 1 :(得分:3)

如果您明确需要一个对象数组,则可以先创建一个类型为object的空数组,然后分配给它:

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从零大小增加元素。