2016-08-23 6 views
0

numpy配列で、 "ワイルドカード"を使ってサブアレイの出現を探したいと思います。Python/NumPyマスクされたサブアレイの最初の出現

a = np.array([1, 2, 3, 4, 5]) 
b = np.ma.array([2, 99, 4], mask=[0, 1, 0]) 

考えられるのは、99がマスクされているため、aでbを検索すると一致が得られるという考えです。

は具体的には、私は方法がhereがうまくいく説明することを期待し、それはしません:

def rolling_window(a, size): 
    shape = a.shape[:-1] + (a.shape[-1] - size + 1, size) 
    strides = a.strides + (a. strides[-1],) 
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) 

a = np.array([1, 2, 3, 4, 5]) 
b = np.array([2, 3, 4]) 
c = np.ma.array([2, 99, 4], mask=[0, 1, 0]) 

workingMatch = rolling_window(a, len(b)) == b 
notWorkingMatch = rolling_window(a, len(c)) == c 

これはとても一致が見つからない...

>>> workingMatch 
array([[False, False, False], 
     [ True, True, True], 
     [False, False, False]], dtype=bool) 

>>> notWorkingMatch 
masked_array(data = [[False False False] 
        [-- -- --] 
        [False False False]], 
      mask = [False True False], fill_value = True) 

になります。何故なの? (私は何かを学びたい) この作品を作るには?

答えて

1

==の代わりにnp.ma.equalを使用してください。

========================

マスクされた配列はdataアレイとマスクアレイからなります。しばしばマスクされた配列は、マスクされた値を無害なもので '塗りつぶしたり、それらを圧縮して他の操作で使用されます。私はこの==テストで何が起こっているか完全にはわからないが、計算を見てみよう。

In [614]: A 
Out[614]: 
array([[1, 2, 3], 
     [2, 3, 4], 
     [3, 4, 5]]) 

In [615]: b 
Out[615]: array([2, 3, 4]) 

In [612]: A==b 
Out[612]: 
array([[False, False, False], 
     [ True, True, True], 
     [False, False, False]], dtype=bool) 

マスクされた配列を持っているdata

In [616]: c 
Out[616]: 
masked_array(data = [2 -- 4], 
      mask = [False True False], 
     fill_value = 999999) 
In [617]: c.data 
Out[617]: array([ 2, 99, 4]) 
In [618]: c.mask 
Out[618]: array([False, True, False], dtype=bool) 
In [619]: (A==c).data 
Out[619]: 
array([[False, False, False], 
     [ True, False, True], 
     [False, False, False]], dtype=bool) 

このdatamaskたちはA==c.dataから期待されています

あなたのストライドは配列を生成します。センター99が一致しません。

しかし、cのようにブール配列全体にマスクが適用されているように見えます。この場合、列配列 - 2番目の列ではなく2番目の列をマスクします。

In [624]: A==c 
Out[624]: 
masked_array(data = 
[[False False False] 
[-- -- --] 
[False False False]], 
      mask = 
[False True False], 
     fill_value = True) 

私の最初の印象はエラーです。しかし、私はもっと掘る必要があります。

dataA==cは2dですが、マスクは1dです。私はc 3行を複製した場合

、その後、私は、所望の結果を得る:

In [638]: c[None,:]*np.array([1,1,1])[:,None] 
Out[638]: 
masked_array(data = 
[[2 -- 4] 
[2 -- 4] 
[2 -- 4]], 
      mask = 
[[False True False] 
[False True False] 
[False True False]], 
     fill_value = 999999) 
In [639]: c1=c[None,:]*np.array([1,1,1])[:,None] 
In [640]: A==c1 
Out[640]: 
masked_array(data = 
[[False -- False] 
[True -- True] 
[False -- False]], 
      mask = 
[[False True False] 
[False True False] 
[False True False]], 
     fill_value = True) 
In [641]: (A==c1).all(axis=1) 
Out[641]: 
masked_array(data = [False True False], 
      mask = [False False False], 
     fill_value = True) 

これを行うクリーンな方法があるかどうかはわからないが、それは解決策をする必要があるなどの方向を示します取る。

np.ma.equalたちは(正しいマスクで==比較)何をしたいん============

In [645]: np.ma.equal(A,c) 
Out[645]: 
masked_array(data = 
[[False -- False] 
[True -- True] 
[False -- False]], 
      mask = 
[[False True False] 
[False True False] 
[False True False]], 
     fill_value = 999999) 
In [646]: np.ma.equal(A,c).any(axis=1) 
Out[646]: 
masked_array(data = [False True False], 
      mask = [False False False], 
     fill_value = True) 

np.ma.equalnp.equalのマスクされた対応バージョンで、どの要素==によってufunc要素のバージョン。

+0

素晴らしい!この詳細な答えをありがとう。 – louic

関連する問題