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

che*_*eyp 5 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)
Run Code Online (Sandbox Code Playgroud)

这很完美: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)
Run Code Online (Sandbox Code Playgroud)

这一次b[1]a1不平等,他们甚至有不同的形状。这种奇怪行为的原因是什么?

也许对我来说有一个完全不同的解决方案。但我不想使用列表或元组,因为我想允许添加诸如b + b. 很明显,我可以为此目的编写自己的类,但有没有更简单的方法?

mdu*_*ant 9

如果您明确想要一个对象数组,您可以首先创建一个类型为 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)
Run Code Online (Sandbox Code Playgroud)

您必须先填充所有元素,然后才能执行算术,或者使用 np.append 从大小零开始增加元素。

  • 是的你可以!正如我所说,您只需填充所有元素 0..4(但仅给出前两个元素的示例)。 (3认同)