在最后2个维度中旋转5D阵列

时间:2016-01-05 14:51:31

标签: python arrays numpy rotation vectorization

我有一个5D数组'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循环

2 个答案:

答案 0 :(得分: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版本没有带axes的{​​{1}}参数,则有其他选择。

一种方法是建立索引:

np.rot90

a180 = a[..., ::-1, ::-1] 翻转第一个数组的两个轴,因此要使用它,您需要转置(反转轴),旋转并再次转置。例如:

rot90

答案 1 :(得分: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]])