5

配列を回転させたいのですが、全体としてではなく、ごく一部だけです。

私は512X512配列を持っています(基本的には、中心(150,150)に半径200のガウス円です)。ここで、配列の小さな部分 (半径 100 で (150,150) の中心) のみを 90 度回転させたいと考えています。最初は numpy rot90 モジュールを使用しましたが、必要のない各配列要素を回転させます。

4

2 に答える 2

6

高度なインデックスを使用してローテーションする要素を記述できる場合は、次のようなものを使用してローテーションを実行できるはずです(配列がと呼ばれると仮定しますarr)。

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

ここrsre、、、、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]])
于 2012-06-18T16:11:58.777 に答える
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)
于 2012-06-18T17:44:16.923 に答える