2017-07-02 6 views
1

このループコードをベクトル表記に変換するにはどうすればよいですか?私はlogical_andを取得しようとすることを含めてたくさんのことを試みましたが、ブロードキャストはしません。このPythonループをベクターコーディングに変換するにはどうしたらいいですか?

import numpy as np 

coord_mask = np.zeros((10, 5), dtype=np.bool) 
latx = np.random.choice(a=[False, True], size=10) 
laty = np.random.choice(a=[False, True], size=5) 

for i in range(0, coord_mask.shape[0]): 
    for j in range(0, coord_mask.shape[1]): 
     coord_mask[i, j] = latx[i] * laty[j] 

print(coord_mask) 

誰でも手助けできますか?

+0

基本的に、私は長さxの配列を横断しようとしています長さyの1つを使用して形状(x、y)のブール値マスク配列を取得し、xi、yi点のみが真となり、残りは偽となります。とても単純なはずですが、私はそれを理解できません。 – BishS

+2

'latx [:、None] * laty' – hpaulj

+0

すべてのx> 0の範囲(0、x)==範囲(x)' – cat

答えて

2

あなたの好きなものを取る:

In [629]: coord_mask = np.zeros((10, 5), dtype=np.bool) 
    ...: latx = np.random.choice(a=[False, True], size=10) 
    ...: laty = np.random.choice(a=[False, True], size=5) 
    ...: 
    ...: for i in range(0, coord_mask.shape[0]): 
    ...:  for j in range(0, coord_mask.shape[1]): 
    ...:   coord_mask[i, j] = latx[i] * laty[j] 
    ...:   
In [630]: coord_mask 
Out[630]: 
array([[False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 

ブロードキャストさ乗算:(Noneは(Nを生成し、(M)laty(等価(1,m))をmultliplies(N、1)列の行列、にlatxをオンに、m)の結果。これは非常に便利で、かつ強力なnumpyツールです。

In [631]: latx[:,None]*laty 
Out[631]: 
array([[False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 

outer

あなたは &のような別のバイナリの動作を置き換えることができ broadcastingアプローチで

In [633]: np.einsum('i,j',latx, laty) 
Out[633]: 
array([[False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 

In [632]: np.outer(latx, laty) 
Out[632]: 
array([[False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 

内積のeinsum一般化が

In [634]: latx[:,None] & laty 
Out[634]: 
array([[False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, True, True, True, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 
+1

オプションを調べていただきありがとうございます。放送の延長は非常に役に立ちます。 – BishS

2

coord_mask = np.outer(latx, laty) 

はトリックを行う必要があることを私には思えます。

+0

ありがとう、これはこの場合最も簡単な答えです。 – BishS

+0

ありがとう@BishS。しかし、@ hpaulj(latx [:、None] * laty)によって提案された解決法は、配列の次元数を増加させます(https://docs.scipy.org/doc/numpy/reference/arraysの 'newaxis'を参照してください)。 indexing.html#basic-slicing-and-indexing)を使用して放送の乗算を使用しても、エレガントで強力です。 –

関連する問題