1

重複の可能性:
Numpy/Python: for ループのない配列反復

サイズが 100x100 のマトリックスがあり、各ピクセルを直接隣接するピクセル (左、上、右、下) と比較し、現在のマトリックスまたは同じサイズの新しいマトリックスに対していくつかの操作を実行するとします。Python/Numpy のサンプル コードは次のようになります。

import numpy as np
my_matrix = np.random.rand(100,100)
new_matrix = np.array((100,100))
my_range = np.arange(1,99)
for i in my_range:
    for j in my_range:

        if my_matrix[i,j+1] > 0.5:
            new_matrix[i,j+1] = 1

        if my_matrix[i,j-1] > 0.5:
            new_matrix[i,j-1] = 1

        if my_matrix[i+1,j] > 0.5:
            new_matrix[i+1,j] = 1

        if my_matrix[i-1,j] > 0.5:
            new_matrix[i-1,j] = 1

        if my_matrix[i+1,j+1] > 0.5:
            new_matrix[i+1,j+1] = 1

        if my_matrix[i+1,j-1] > 0.5:
            new_matrix[i+1,j-1] = 1

        if my_matrix[i-1,j+1] > 0.5:
            new_matrix[i-1,j+1] = 1

隣接するセルに足を踏み入れて、そこから開始して隣接するセルと比較したい場合、これは非常に厄介になる可能性があります...これをより効率的な方法で行う方法について提案はありますか? これは可能ですか?

4

2 に答える 2

2

境界でのインデックス作成の問題を無視することは、コードで何を目指しているのか100%わかりません

new_matrix = my_matrix > 0.5

しかし、モルフォロジー演算を使用すると、これらの計算の高度なバージョンをすばやく実行できます。

import numpy as np
from scipy.ndimage import morphology

a = np.random.rand(5,5)
b = a > 0.5

element = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
result = morphology.binary_dilation(b, element) * 1
于 2012-12-13T10:32:09.440 に答える
0

これを「厄介になる」のを防ぐ方法は次のとおりです。関数にネイバーチェックコードをカプセル化します。その後、必要に応じて隣人の座標で呼び出すことができます。

チェックしたペアを追跡して、同じペアを保持しないようにする必要がある場合は、その上に何らかのメモ化を使用します。

于 2012-12-13T13:40:29.517 に答える