围绕中心单元旋转3x3阵列的每个单元的模块(不是矩阵旋转)

时间:2017-07-03 20:18:28

标签: python numpy scipy

我想旋转数组,但不喜欢基本的矩阵旋转。如果我有一个3x3阵列,我希望每个单元转向中央单元。

这是一个3x3阵列:

import numpy as np

tab = np.array([[1,2,3],[4,5,6],[7,8,9]])

[[1 2 3]
 [4 5 6]
 [7 8 9]]

我希望将它旋转45度:

[[2 3 6]
 [1 5 9]
 [4 7 8]]

我不能使用scipy.ndimage.interpolation.rotate(tab,45),因为它应用了基本的矩阵旋转,这不是我想要的。

import numpy as np
from scipy import ndimage

tab = np.array([[1,2,3],[4,5,6],[7,8,9]])

ndimage.interpolation.rotate(tab,45)

[[0 0 0 0]
 [0 2 6 0]
 [0 4 8 0]
 [0 0 0 0]]

有人知道如何实现这一目标吗?

3 个答案:

答案 0 :(得分:5)

你几乎只是用它:

ndimage.interpolation.rotate(tab,45,reshape=False,mode='nearest')

问题是你需要强制方法不重塑你的矩阵,并使用最接近的数字填充空白而不是零。

零的问题在于,当您旋转矩阵时,某些数字(角落中的数字)会超出边界,因此您需要预测"那些最近的角落就像精确的here

一样

输出:

[[2 3 6]
 [1 5 9]
 [4 7 8]]

再次旋转它会给出:

[[3 6 9]
 [2 5 8]
 [1 4 7]]

等。

答案 1 :(得分:4)

如果您只想在3x3阵列上使用它,一个简单的解决方案是按顺时针/逆时针顺序列出索引(例如:[(0, 0), (0, 1), (0, 2), (1, 2), (2, 2), (2, 1), (2, 0), (1, 0)]),然后对于旋转,您只需根据以下方式移动值:列表索引(按度/ 45°位置)。

答案 2 :(得分:2)

您可以通过创建一对索引数组(在其中可以直观地看到旋转)来执行此操作:

x[0]

然后按预期工作:

i = np.array([
    [0, 0, 1],
    [0, 1, 2],
    [1, 2, 2]
])
j = np.array([
    [1, 2, 2],
    [0, 1, 2],
    [0, 0, 1]
])

这实际上是BalázsKovacsics解决方案的矢量化实现,它应该比>>> tab = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>> tab[i,j] array([[2, 3, 6], [1, 5, 9], [4, 7, 8]]) 解决方案更快

要旋转两次,您可以使用

ndimage