Redimension numpy数组动态

时间:2013-11-12 18:08:02

标签: python numpy multidimensional-array

我有一个数组,让我们说:

A = np.array([1., 2.])

我可以通过简单地执行以下操作来添加新维度:

def redim(arr):
   return arr[:, None]

现在,我想以这种方式动态添加额外的维度:

def redim(arr, dims):
   return arr[dims]

所以我可以这样做:

redim(A, [:, None])
redim(A, [None, :])
redim(A, [none, :, None])

有人知道这是否可行?

应该是什么样的第二个参数,以便我可以动态修改它? (字符串,obj,列表)? 我如何connect两个参数来获得扩展数组?

我知道我可以使用expand_dims路线,但是如果有一种方法可以在一次滑动中定义所有扩展尺寸,我的代码会更加清晰。

提前致谢!

1 个答案:

答案 0 :(得分:5)

我认为reshape正是您所寻找的。

如果弦理论教给我们一件事,那就是一切都需要11个维度:

>>> A = np.array([1,2])
>>> A = A.reshape((2,1,1,1,1,1,1,1,1,1,1))
>>> A
array([[[[[[[[[[[1]]]]]]]]]],






   [[[[[[[[[[2]]]]]]]]]]])

现在你可以在任何方面获得切片:

>>> A[1,:,:,:,:,0]
array([[[[[[[[[2]]]]]]]]])

使用重塑时唯一的要求是元素总数不变(即尺寸乘积必须在第一和第二形状之间保持不变)

修改

如果你想要使用切片,你必须传递tuple个参数,如下所示:

def redim(a, dims):
    return a[dims]

>>> redim(A, (slice(None), None, slice(None), None))

Numpy数组在传递参数元组时有一个特殊的行为(这正是封面下的A[1,2,:]之类的多索引),如果你想将调用包装到[]运算符,你实际上必须遵守np.ndarray.__getitem__功能签名。

要获得多维索引,它需要一组int,Noneslice对象(使用切片表示法时创建的对象,例如A[1:2] <=> A.__getitem__(slice(1,2)))。使用它非常麻烦,但如果你坚持数组的numpy约定,你可以包装所有numpy操作(汇总here