旋转一个5D数组的最后两个维度。

5

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

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度,但不改变它们的位置。因此,output[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循环。
2个回答

2
为了将最后两个轴旋转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函数翻转数组的前两个轴,因此使用它需要先对数组进行转置(以反转轴),旋转后再次进行转置。例如:

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

谢谢。我没有想到那个。 - Babak

1
如果我正确理解了问题,您可以将最后两个轴上的元素排列反转,如下所示 -
a[:,:,::-1,::-1]

您还可以将其重塑为一个2D数组,将最后两个轴合并为最后一个轴,然后沿着它反转元素并重新调整形状,像这样 -
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]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接