python - 了解 Numpy rot90 轴

标签 python numpy

Numpy 的 rot90 函数 promise 使用轴参数将 2d 或更高的数组旋转 90 度。方法:

numpy.rot90(m, k=1, axes=(0, 1))[source]

Rotate an array by 90 degrees in the plane specified by axes. 
Rotation direction is from the first towards the second axis.
我对轴部分很困惑。对象可以绕 x、y 或 z 轴旋转。通常,这是由诸如 Vector3f 之类的东西定义的,其中 3 个浮点数定义了轴值(例如 (0, 0, 1) 围绕 z 轴旋转。)我不明白这两个数字如何用于旋转3d 对象,不应该像 Vector3f 一样是 3 吗?谁能帮助我理解这两个轴的含义,以及分别用于绕 x、y 和 z 轴旋转的两个数字是什么?我尝试了许多不同的数字组合,它们都有不同的结果(我不能输入两个相同的数字),但我不知道如何用两个数字获得足够的信息(k 代表次数旋转。)

最佳答案

我喜欢使用具有不同值和维度的样本数组,例如 np.arange(24).reshape(2,3,4) .
在这种情况下,我还查看了代码。经过一些初步确定axesk是对的,它根据 k 的 4 个可能值做不同的事情。 .axes定义一个“平面”。使用 3d 阵列,axes=(0,1)可以认为是绕第三轴 (2) 旋转,想象一个垂直于该“平面”的“矢量”。但代码中使用的是这些轴值。虽然我怀疑我们可以使用基于三角的旋转矩阵构造等效的操作,但此代码不进行任何计算。 (请注意,整数不会更改为浮点数。)k=0什么都不改变:

In [104]: np.rot90(m,k=0, axes=(0,1))
Out[104]: 
array([[[ 0,  1,  2,  3],         # shape (2,3,4)
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
k=1涉及一个翻转,然后是一个转置
In [105]: np.rot90(m,k=1, axes=(0,1))
Out[105]: 
array([[[ 8,  9, 10, 11],           # shape (3,2,4)
        [20, 21, 22, 23]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 0,  1,  2,  3],
        [12, 13, 14, 15]]])
k=2更简单 - 只是在两个轴上翻转。这很容易形象化。最后一个维度不变(跨行),但平面和行颠倒了:
In [106]: np.rot90(m,k=2, axes=(0,1))
Out[106]: 
array([[[20, 21, 22, 23],
        [16, 17, 18, 19],
        [12, 13, 14, 15]],

       [[ 8,  9, 10, 11],
        [ 4,  5,  6,  7],
        [ 0,  1,  2,  3]]])
k=3先翻转,然后转置
In [107]: np.rot90(m,k=3, axes=(0,1))
Out[107]: 
array([[[12, 13, 14, 15],         # again (3,2,4)
        [ 0,  1,  2,  3]],

       [[16, 17, 18, 19],
        [ 4,  5,  6,  7]],

       [[20, 21, 22, 23],
        [ 8,  9, 10, 11]]])
看步伐:
In [111]: m.strides
Out[111]: (96, 32, 8)
In [112]: np.rot90(m,k=2, axes=(0,1)).strides
Out[112]: (-96, -32, 8)                # the double flip
转置切换顺序,而翻转再次更改符号:
In [113]: np.rot90(m,k=1, axes=(0,1)).strides
Out[113]: (-32, 96, 8)
In [114]: np.rot90(m,k=3, axes=(0,1)).strides
Out[114]: (32, -96, 8)
因为它只是使用 fliptranspose结果是 view .
更简单的 (1,3,4) 数组
在一个表示一个平面中的值的数组中可视化可能更容易,一个 (3,4) 数组:
In [120]: m = np.arange(12).reshape(1,3,4)
In [121]: m
Out[121]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]])
In [122]: np.rot90(m,k=2, axes=(1,2))
Out[122]: 
array([[[11, 10,  9,  8],
        [ 7,  6,  5,  4],
        [ 3,  2,  1,  0]]])
In [123]: np.rot90(m,k=1, axes=(1,2))  # visualize a counterclockwise rotation
Out[123]: 
array([[[ 3,  7, 11],
        [ 2,  6, 10],
        [ 1,  5,  9],
        [ 0,  4,  8]]])
In [124]: np.rot90(m,k=3, axes=(1,2))    # clockwise
Out[124]: 
array([[[ 8,  4,  0],
        [ 9,  5,  1],
        [10,  6,  2],
        [11,  7,  3]]])
k=3也可以通过 1 和 2 连续逆时针旋转来可视化。

关于python - 了解 Numpy rot90 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63972190/

相关文章:

numpy - 数据集中模式的随机化

python - 带有元组的二维 numpy 数组 : expanding into multiple arrays w/combinations of original tuples

python - 拟合曲线 : why small numbers are better?

python - os.open vs open,使用什么

Python 2.7 变量类型保持为 int32 而不是转换为 long

python - 在 QStyledItemDelegate 中显示 QComboBox 文本而不是索引值

python - 基于列的 2 个数据框之间的减法

python - 在 Debian 上安装 scikit-learn 需要哪些软件包

python - 找出 Numpy 是否/使用哪个 BLAS 库

python - 在数据框中成对排列条目序列