3

我有一个数组,可以说:

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])

有人知道这是否可能吗?

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

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

提前致谢!

4

1 回答 1

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]]]]]]]]])

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

编辑

如果你想使用切片,你必须传递一个tuple参数,像这样:

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

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

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

为了获得多维索引,它需要一个整数元组Noneslice对象(这是使用切片符号时创建的对象,例如A[1:2] <=> A.__getitem__(slice(1,2)))。使用起来非常麻烦,但是如果您坚持数组的 numpy 约定,则可以包装所有 numpy 操作(此处总结)

于 2013-11-12T18:16:25.623 回答