我想旋转数组但不是整体,只是它的一小部分。我有512X512阵列(基本上它是中心的高斯圆(150,150),半径为200)。现在我想将阵列的小部分(中心(150,150),半径为100)旋转90度。最初我使用numpy rot90模块,但它旋转每个数组元素,这不是我想要的。如有任何反馈,我将不胜感激。
由于
- 病毒
答案 0 :(得分:5)
如果您可以使用advanced indexing描述要旋转的元素,那么您应该能够使用以下内容执行旋转(假设您的数组被称为arr
):
arr[rs:re,cs:ce] = np.rot90(np.copy(arr[rs:re,cs:ce]))
此处rs
,re
,cs
和ce
表示切片的行开始和行尾,以及列 - 开始和列 - 分别结束。
以下是为什么需要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]])
答案 1 :(得分:1)
以下是一些更全面的代码,F.J.
已经解释过了。
以下是代码:
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)