我想旋转数组,但不喜欢基本的矩阵旋转。如果我有一个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]]
有人知道如何实现这一目标吗?
答案 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