2017-07-03 41 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]])