Pythonの:バイナリマスクのインデックスから1秒までの距離

Knub:

私はこのようなバイナリマスクを持っています:

X = [[0, 0, 0, 0, 0, 1],
     [0, 0, 0, 0, 1, 1],
     [0, 0, 0, 1, 1, 1],
     [0, 0, 1, 1, 1, 1],
     [0, 0, 1, 1, 1, 1],
     [0, 0, 0, 1, 1, 1]]

私は、この配列内の特定のインデックスを持っており、そのインデックスから最も近い距離を計算したい1マスク内を。すでにがある場合1、そのインデックスで、距離はゼロでなければなりません。例(マンハッタン距離を想定):

distance(X, idx=(0, 5)) == 0 # already is a 1 -> distance is zero
distance(X, idx=(1, 2)) == 2 # second row, third column
distance(X, idx=(0, 0)) == 5 # upper left corner

このような既存の機能は、Python / numpyの/ scipyのダウンロードには、既にありますか?どちらのユークリッドとマンハッタン距離は大丈夫でしょう。私は(それが私の場合はかなり大きいと)全体のマトリックスのための距離を計算避けることを好む、とだけ私の一つのインデックスのための距離を取得したいです。

Divkr:

ここに1つですmanhattanつのエントリのメトリックの距離が-

def bwdist_manhattan_single_entry(X, idx):
    nz = np.argwhere(X==1)
    return np.abs((idx-nz).sum(1)).min()

サンプルの実行 -

In [143]: bwdist_manhattan_single_entry(X, idx=(0,5))
Out[143]: 0

In [144]: bwdist_manhattan_single_entry(X, idx=(1,2))
Out[144]: 2

In [145]: bwdist_manhattan_single_entry(X, idx=(0,0))
Out[145]: 5

唯一のブロブオフboudary要素を抽出することによってパフォーマンスにさらに最適化1s-

from scipy.ndimage.morphology import binary_erosion

def bwdist_manhattan_single_entry_v2(X, idx):
    k = np.ones((3,3),dtype=int)
    nz = np.argwhere((X==1) & (~binary_erosion(X,k,border_value=1)))
    return np.abs((idx-nz).sum(1)).min()

内の要素の数nzこの方法では、したがって、それが改善され、以前よりも少ない数であろう。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=4514&siteId=1