2016-04-27 7 views
0

これは、numpy.searchsortedの面白い動作です。次のテストは失敗:numpy検索で何が間違っていますか?

import numpy as np 

a = np.ma.masked_array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
         17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
         31, 32, 33, 0], 
         mask=[False, False, False, False, False, False, False, 
          False, False, False, False, False, False, False, 
          False, False, False, False, False, False, False, 
          False, False, False, False, False, False, False, 
          False, False, False, False, False, True], 
         fill_value=0, dtype='uint8') 

b = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33], 
      dtype='uint8') 

expected = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
       14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 
       28, 29, 32]) 

c = a.searchsorted(b) 

np.testing.assert_array_equal(c, expected) 

c配列の最後のエントリは34であり、私は理由を知りません。 しかし、同様のもの、それは合格:numpy.array.searchsortedマニュアルの

aa = np.ma.masked_array([1, 2, 3, 4, 0], 
         mask=[False, False, False, False, True], 
         fill_value=0, dtype='uint8') 

bb = np.array([1, 3, 4], dtype='uint8') 

expectedd = np.array([0, 2, 3]) 

cc = aa.searchsorted(bb) 

np.testing.assert_array_equal(cc, expectedd) 

を、その説明は言った:

は、Vの対応する要素の前に挿入された場合、このようなことがソートされた配列のインデックスを探しますインデックス、aの順序は保持されます。

+1

A'が原因でソートされていない第一の入力を '' 'np.searchsorted'で追加の入力引数' sorter'を使用しなければならないかもしれません。 – Divakar

+0

@Divakarこれはマスクされた配列であり、マスクされた値が最後のものであり、numpyがこの順序を定義するので、ソートされます。 'a'で' argsort'メソッドを使用すると、順序付けられたシーケンスとしてインデックスが得られます – jmbarrios

+0

ええと、私は考慮しなかったのです。 – Divakar

答えて

0

np.searchsortedはまだマスクされた配列(サポートされるメソッドのリストについてはsee here)をサポートしていません。

することはでき、手動で、その後np.searchsortedに最初の引数として結果を渡し、a.maskの逆数でaにインデックスを付けることにより、期待される結果が得られます。

c = np.searchsorted(a[~a.mask], b) 

# or alternatively, a[~a.mask].searchsorted(b) 

print(np.allclose(c, expected)) 
# True 
+0

numpyのサポート[マスクされた配列の検索](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ma.MaskedArray.searchsorted.html) また、2番目のケースでは、 'aa'、' bb'、および 'cc'で、私は期待される結果を得ますが、問題は最初の場合です。 – jmbarrios

+0

申し訳ありませんが、最初は間違ったテストケースを使用しました。 '.searchsorted'メソッドは' numpy.ndarray'から継承されています。マスクを無視する意味では "サポートされていません"。 –

関連する問題