n x m
マスク入力を使用して、配列を領域に「分割」する必要があります。
たとえば、20 x 20
配列があるとします。私のマスクは次のとおりです(5 x 5
)-常に:
ここで、数字はセルが参加する領域を表します。このマスクは入力ではなく、単なるndarray
。です。このマスクは20 x 20
、すべての5 x 5
近所で自分をスライスする方法を表しています。
たとえば、最初の領域はインデックスを理解します。
(0,0)、(1,0)、(1,1)、(2,0)、(2,1)、(2,2)
配列の各5 x 5
近傍について、20 x 20
各8
領域にある値を返す必要があります。
私は「標準コード」でそれを行う方法を知っていますが、簡潔なコードで可能である、それを行うPythonの方法があるかどうか疑問に思います。
コード例として、次のようなことができます。
def slice_in_regions(data, x_dim, y_dim):
for x in xrange(0, x_dim, 5):
for y in xrange(0, y_dim, 5):
neighbors = data[x:x+4, y:y+4]
region1 = [neighbors[0,0], neighbors[1,0], neighbors[1,1], neighbors[2,0], neighbors[2,1], neighbors[2,2]]
# region2, region3...
しかし、それはそれを行うための良い方法ではないようです。さらに、私のデータの次元はの倍数になることを期待しています5
。
ありがとうございました。
マスクのサイズを変更するだけでよいようです。たとえば、すでに使用している場合はnumpy
、
mask = mask.repeat(4, axis=0).repeat(4, axis=1)
# Then you apply the mask using
values = data[mask]
そうでなければ、
import numpy as np
mask = np.repeat(mask, 4, axis=0).repeat(4, axis=1)
# Then you apply the mask using
values = np.array(data)[mask]
個々の地域
各地域に個別にアクセスする必要がある場合は、ラベル付きマスクを使用して前の地域に先行することができます。ラベルはラベル付きの領域に成長するため、使用できます。
values = [ data[mask==l] for l in range(1, mask.max()+1)]
ここで、値は、各項目がのラベル付き領域に対応する配列のリストになりますmask
。
ラベル付きマスクの生成
完全を期すために、バイナリマスクから、すべてのピクセルに独自のラベルが付いているラベル付きマスクに移行するには、次を使用できます。 scipy.ndimage.label
mask = ndimage.label(mask, [[0,0,0],[0,1,0],[0,0,0]])
または、領域ラベル付け機能の使用がやり過ぎの場合は、次を使用して同様の結果を得ることができます。
mask[mask] = range(1,mask.sum()+1)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加