2016-10-31 3 views
0

座標、インデックス所与のものとゼロのnumpyのアレイを充填する/ゼロのnumpyの配列を指定

arr = np.zeros((5, 5)) 

とポリゴンの頂点を表すインデックスの配列を言う方法、

verts = np.array([[0, 2], [2, 0], [2, 4]]) 
を言います

1)

for v in verts: 
    arr[v[0], v[1]] = 1 
結果の配列が

であるような

を行うためのエレガントな方法は何ですか

In [108]: arr 
Out[108]: 
array([[ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 1., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

2)どのように私は、出力配列は、あなたの質問の最初の部分に答えるために

In [158]: arr 
Out[158]: 
array([[ 0., 0., 1., 0., 0.], 
     [ 0., 1., 1., 1., 0.], 
     [ 1., 1., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

答えて

2

であるようなもので配列を埋めることができます:arr[tuple(verts.T)] = 1

verts.T(2, n)にあなたのインデックスを転置2つの行は、arrの行と列の次元に対応しています。これらは(row_indices, col_indices)のタプルに解凍され、arrのインデックスに使用されます。

我々はもう少し冗長にこれを書くことができるよう:第二部分について

row_indices = verts[:, 0] 
col_indices = verts[:, 1] 
arr[row_indices, col_indices] = 1 

here説明したように、matplotlib.Path.contains_pointsを使用することで、任意の多角形で機能する一つの方法:

from matplotlib.path import Path 

points = np.indices(arr.shape).reshape(2, -1).T 
path = Path(verts) 
mask = path.contains_points(points, radius=1e-9) 
mask = mask.reshape(arr.shape).astype(arr.dtype) 

print(repr(mask)) 
# array([[ 0., 0., 1., 0., 0.], 
#  [ 0., 1., 1., 1., 0.], 
#  [ 1., 1., 1., 1., 1.], 
#  [ 0., 0., 0., 0., 0.], 
#  [ 0., 0., 0., 0., 0.]]) 
+0

[2,0]をマスクするべきではありませんか? – DSM

+0

@DSM浮動小数点の問題だと思います。回避策は 'radius'を小さな正の値に設定することです –

関連する問題