2017-07-03 39 views
1

我想旋转数组但不像基本矩阵旋转。如果我有一个3x3阵列,我希望每个单元都围绕中心单元转动。在中央单元周围旋转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]] 

有没有人知道这是如何实现的?

回答

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

太棒了,谢谢你的解释。 –

+1

这可能不会对大于3x3的矩阵做正确的事 – Eric

4

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

+1

我接受了@Rayhane妈妈的答案,因为这是我想要的,但是您的答案仍然有效,感谢这个想法。 –

2

可以通过创建一对索引阵列(其中一个旋转可以在视觉上看到的)做到这一点:

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

根据需要,然后工作的:

>>> 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]]) 

这基本上是一个矢量化BalázsKovacsics解决方案的实施,该解决方案应该快于ndimage解决方案

要旋转两次,您可以使用

>>> tab[i,j][i,j] 
array([[3, 6, 9], 
     [2, 5, 8], 
     [1, 4, 7]]) 

>>> i2 = i[i,j] 
>>> j2 = j[i,j] 
>>> tab[i2,j2] 
array([[3, 6, 9], 
     [2, 5, 8], 
     [1, 4, 7]])