在最后 2 个维度中旋转 5D 数组

Rotating a 5D array in the last 2 dimensions

我有一个 5 维数组 'a',大小为 (3,2,2,2,2)。

import numpy as np
a = np.arange(48).reshape(3,2,2,2,2)
a[0,0,0]:
array([[0, 1],
       [2, 3]])

我想做的是将这个 5D 数组旋转 180 度,但只在最后两个维度上旋转,位置不变。所以输出 [0,0,0] 应该是这样的:

out[0,0,0]:
array([[3, 2],
       [1, 0]])

我尝试过的:

out = np.rot90(a, 2)
out[0,0,0]:
array([[40, 41],
       [42, 43]])

rot90 函数显然旋转了整个数组。

注意:我想尽可能避免使用 for 循环

如果我理解正确的话,你可以反转元素沿最后两个轴的排列,像这样-

a[:,:,::-1,::-1]

您还可以重塑为二维数组,将最后两个轴合并为最后一个轴,然后 reverse 沿着它的元素并重新整形,就像这样 -

a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape)

样本运行-

In [141]: a[0][0]
Out[141]: 
array([[57, 64, 69],
       [41, 28, 89]])

In [142]: out1 = a[:,:,::-1,::-1]

In [143]: out2 = a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape)

In [144]: out1[0][0]
Out[144]: 
array([[89, 28, 41],
       [69, 64, 57]])

In [145]: out2[0][0]
Out[145]: 
array([[89, 28, 41],
       [69, 64, 57]])

要将最后两个轴旋转 180 度,将 axes=(-2, -1) 传递给 np.rot90:

>>> a180 = np.rot90(a, 2, axes=(-2, -1))
>>> a180[0, 0, 0]
array([[3, 2],
       [1, 0]])

如果您的 NumPy 版本没有带 np.rot90axes 参数,还有其他选择。

一种方法是使用索引:

a180 = a[..., ::-1, ::-1]

rot90 翻转数组的 first 两个轴,因此要使用它你需要转置(反转轴)、旋转和转置再次回来。例如:

np.rot90(a.T, 2).T