如何对3D数组内的每个2D数组单独执行90度旋转?
NumPy 3D数组逐2D子数组90度旋转实现
问题场景
现有一个由多个2D数组堆叠构成的3D NumPy数组,需要在不改变内部2D数组原有排列顺序的前提下,对每个内嵌的2D数组单独执行90度旋转,最终得到由旋转后2D数组组成的新3D数组。
示例原始数组:
import numpy as np foo = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(foo)
输出:
array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]])
原始数组形状:
foo.shape # 输出 (2, 2, 3)
期望旋转结果:
rotated_foo = np.array([[[4, 1], [5, 2], [6, 3]], [[10, 7], [11, 8], [12, 9]]]) print(rotated_foo)
输出:
array([[[ 4, 1], [ 5, 2], [ 6, 3]], [[10, 7], [11, 8], [12, 9]]])
期望结果形状为(2, 3, 2)。
直接调用无参数的np.rot90(foo)无法得到预期结果,输出如下:
array([[[ 4, 5, 6], [10, 11, 12]], [[ 1, 2, 3], [ 7, 8, 9]]])
返回数组形状仍为(2, 2, 3),本质是对整个3D数组做了旋转,而非逐个处理内部2D子数组。
解决方法
出现上述问题的原因是np.rot90默认对数组的前两个维度执行旋转操作,没有指定操作维度时会打乱第0维(也就是子数组堆叠的维度)的顺序。只要通过axes参数明确指定旋转作用在每个子数组对应的两个维度即可:
rotated_foo = np.rot90(foo, k=1, axes=(1, 2))
执行后验证结果,和预期完全一致:
print(rotated_foo) # 输出 # array([[[ 4, 1], # [ 5, 2], # [ 6, 3]], # # [[10, 7], # [11, 8], # [12, 9]]]) rotated_foo.shape # 输出 (2, 3, 2)
参数说明
k:旋转次数,k=1为逆时针旋转90度,k=2为旋转180度,k=3为顺时针旋转90度axes=(1,2):指定旋转操作作用在索引为1、2的两个维度上,也就是每个2D子数组的行、列维度,索引为0的子数组堆叠维度保持不变,不会改变原有2D数组的排列顺序。
内容的提问来源于stack exchange,提问作者A'S
相关产品推荐
相关产品推荐

