Redimension numpy数组动态

fjs*_*js6 3 python numpy multidimensional-array

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

A = np.array([1., 2.])
Run Code Online (Sandbox Code Playgroud)

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

def redim(arr):
   return arr[:, None]
Run Code Online (Sandbox Code Playgroud)

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

def redim(arr, dims):
   return arr[dims]
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

redim(A, [:, None])
redim(A, [None, :])
redim(A, [none, :, None])
Run Code Online (Sandbox Code Playgroud)

有人知道这是否可能吗?

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

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

提前致谢!

val*_*val 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]]]]]]]]]]])
Run Code Online (Sandbox Code Playgroud)

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

>>> A[1,:,:,:,:,0]
array([[[[[[[[[2]]]]]]]]])
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

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

>>> redim(A, (slice(None), None, slice(None), None))
Run Code Online (Sandbox Code Playgroud)

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

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