numpyのndarrayに「境界ボックス」関数(ゼロ以外の値のスライス)はありますか?

StackOverflow https://stackoverflow.com/questions/4808221

質問

numpy.array()を介して作成された配列を扱っており、画像をシミュレートするキャンバスにポイントを描画する必要があります。意味のあるデータを含む配列の中央部分にはゼロ値がたくさんあるため、アレイを「トリミング」し、ゼロのみを含む列のみを含む列を消去したいと思います。

だから、私はいくつかのネイティブのnumpy関数またはコードスニペットを知り、アレイのデータを含む部分のみをスライスするために「境界ボックス」を「トリミング」したり、見つけたりしたいと思います。

(それは概念的な質問であるため、コードを入れませんでした。すみません、すみません、投稿するのはとても新鮮です。)

読んでくれてありがとう

役に立ちましたか?

解決

以下のコード、から この答え 私のテストで最速で実行されます:

def bbox2(img):
    rows = np.any(img, axis=1)
    cols = np.any(img, axis=0)
    ymin, ymax = np.where(rows)[0][[0, -1]]
    xmin, xmax = np.where(cols)[0][[0, -1]]
    return img[ymin:ymax+1, xmin:xmax+1]

使用した受け入れられた回答 argwhere 働いたが、走った。私の推測では、それはだからです argwhere インデックスの巨大な出力配列を割り当てます。大きな2Dアレイ(1024 x 1024画像、約50x100の非ゼロ領域)でテストしました。

他のヒント

これはそれをする必要があります:

from numpy import array, argwhere

A = array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])

B = argwhere(A)
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1 
Atrim = A[ystart:ystop, xstart:xstop]

何かのようなもの:

empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)

結果の配列は、1Dブールアレイになります。両端からそれらをループして、「境界ボックス」を見つけます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top