2012-06-18 28 views
4

我想旋轉一個數組,但不是整體,只有一小部分。我有512X512陣列(基本上它是一個高斯圓在中心(150,150),半徑爲200)。現在我只想旋轉90度的小部分(以半徑100爲中心(150,150))。最初我使用numpy rot90模塊,但它旋轉了每個不是我想要的數組元素。我會很感激任何反饋。在python中旋轉90度數組的一小部分

感謝

-Viral

+1

通過數組你的意思'numpy.array'? – jsalonen

回答

5

如果你能描述你想使用advanced indexing旋轉的元素,那麼你應該能夠使用類似如下(假設你的陣列進行的旋轉稱爲arr ):

arr[rs:re,cs:ce] = np.rot90(np.copy(arr[rs:re,cs:ce])) 

這裏rsrecsce將意味着該行開始和行-E一個切片的nd,一個切片的列開始和列結束。

這裏是爲什麼np.copy電話是必要的(至少在numpy的1.3.0)的例子:

>>> import numpy as np 
>>> m = np.array([[i]*4 for i in range(4)]) 
>>> m 
array([[0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3]]) 
>>> m[1:3,1:3] = np.rot90(m[1:3,1:3])  # rotate middle 2x2 
>>> m 
array([[0, 0, 0, 0], 
     [1, 1, 2, 1],  # got 1, 2 expected 1, 2 
     [2, 1, 1, 2],  #  1, 1   1, 2 
     [3, 3, 3, 3]]) 
+0

我不認爲你需要'np.copy'。 – ecatmur

+0

@ecatmur - 我認爲你做到了! – fraxel

+0

增加了一個例子來說明爲什麼'np.copy'是必要的。 –

1

下面是一些更全面的代碼,不會作爲F.J.已作解釋。

enter image description here

這裏是代碼:

import numpy as np 
import scipy 

def circle(im, centre_x, centre_y, radius): 
    grid_x, grid_y = np.mgrid[0:im.shape[0],0:im.shape[1]] 
    return (grid_x-centre_x)**2 + (grid_y-centre_y)**2 < radius**2 

centre_x, centre_y, radius = 150, 200, 100 
x_slice = slice(centre_x - radius, centre_x + radius) 
y_slice = slice(centre_y - radius, centre_y + radius) 

im = scipy.misc.imread('1_tree.jpg') 
rotated_square = np.rot90(im[x_slice,y_slice].copy()) 
im[circle(im, centre_x, centre_y,radius)] = rotated_square[circle(rotated_square, 
                 radius, radius, radius)] 
scipy.misc.imsave('sdffs.png',im)