翻转任意维度的numpy数组

时间:2017-07-19 07:31:30

标签: python arrays numpy slice

我想构建一个辅助函数,在所有维度上翻转任意维度的多维numpy数组。令人惊讶的是,我还没有在网上找到任何关于此的内容。

我们可以做这样丑陋的事情:

d = len(X.shape)
if d == 1:
    reversed_X = X[::-1]
elif d == 2:
    reversed_X = X[::-1, ::-1]
elif d == 3:
    reversed_X = X[::-1, ::-1, ::-1]
elif d == 4:
    reversed_X = X[::-1, ::-1, ::-1, ::-1]  
# ...etc

但必须有更好的方法。

我尝试构建切片对象列表并按如下方式使用它们:

X[[slice(s,-1,-1) for s in X.shape]]

但是这返回了一个空数组(!)。更改切片的端点,如:

X[[slice(s,0,-1) for s in X.shape]]

几乎可以正常工作,但它错过了每个维度中的最后一个索引,使“反转”数组略小于原始数据。

2 个答案:

答案 0 :(得分:4)

在我发布之后几乎立即找出了我自己问题的答案。在这里张贴给未来的人们。

由于某种原因,即使向后跨步,也不能告诉切片对象停在-1。但幸运的是,你可以停在'无',这会使阵列向后饱和。将此应用于原始问题中的代码:

reversed_X = X[[slice(None,None,-1) for s in X.shape]]

示例:

In: X = np.reshape(np.arange(2*3), (2,3))
In: X
Out: 
array([[0, 1, 2],
       [3, 4, 5]])
In: X[[slice(None,None,-1) for s in X.shape]]
Out: 
array([[5, 4, 3],
       [2, 1, 0]])

答案 1 :(得分:2)

numpy.flip(m, axis)(numpy版本1.12.0中的新功能。)

所以这可行:

for k in range(X.ndim):
    X = np.flip(X, k)