2016-08-16 5 views

答えて

0

あなたがnp.whereを使用しようとしている方法が間違っているので、のようなので、我々は、実装を持っているでしょう。 np.whereの最初の引数はブール値の配列でなければならず、ブール値を渡すだけです。

foo in bar 
>>> False 
np.where(False) 
>>> (array([], dtype=int32),) 
np.where(np.array([True, True, False])) 
>>> (array([0, 1], dtype=int32),) 

問題がnumpyのがelement-wise boolean operationとしてin演算子を定義していないことです。

あなたが望むものを達成できる方法の1つは、リストの理解です。 inを使用してのいくつかの例で

foo = 'aa' 
bar = np.array(['aaa', 'aab', 'aca']) 
out = [i for i, v in enumerate(bar) if foo in v] 
# out = [0, 1] 

bar = ['aca', 'bba', 'baa', 'aaf', 'ccc'] 
out = [i for i, v in enumerate(bar) if foo in v] 
# out = [2, 3] 
5

我々が見つからない場合は-1を返しますbarの各要素、中foo文字列の位置を見つけるためにnp.core.defchararray.findを使用することができます。したがって、からの出力で-1をチェックすることによって、各要素にfooが存在するかどうかを検出することができます。最後に、np.flatnonzeroを使用して一致のインデックスを取得します。

np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1) 

サンプル実行 - -

In [91]: bar 
Out[91]: 
array(['aaa', 'aab', 'aca'], 
     dtype='|S3') 

In [92]: foo 
Out[92]: 'aa' 

In [93]: np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1) 
Out[93]: array([0, 1]) 

In [94]: bar[2] = 'jaa' 

In [95]: np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1) 
Out[95]: array([0, 1, 2]) 
+0

これは完全に機能します。どうもありがとうございました!しかし、好奇心の中で、なぜnp.whereの状態が悪いのか分かりますか? – SiOx

+0

@SiOx AFAIK 'foo'はNumPy配列であり、' in'では動作しません。その 'in'はPythonのリストなどに意味があるのでしょうか? – Divakar

+0

'in'は配列で動作します。つまり、' ndarray'は '__contains__'メソッドを持っています。しかし、行動はリストと同様です。 – hpaulj

0

ルック:

In [19]: bar = np.array(["aaa", "aab", "aca"]) 

In [20]: 'aa' in bar 
Out[20]: False 

In [21]: 'aaa' in bar 
Out[21]: True 

In [22]: 'aab' in bar 
Out[22]: True 

In [23]: 'aab' in list(bar) 

配列をリストしたかのように、アレイの作品で使用された場合にはinのように見えます。 ndarrayには__contains__というメソッドがありますので、inが動作しますが、おそらく単純です。

いずれにしても、in alistは部分文字列をチェックしません。 strings__contains__は部分文字列テストを行いますが、コンポーネント文字列にテストを伝播する組み込みクラスはわかりません。

Divakarには、配列の個々の要素に文字列メソッドを適用するnumpy関数のコレクションがあります。

In [42]: np.char.find(bar, 'aa') 
Out[42]: array([ 0, 0, -1]) 

ドキュメント文字列:
このモジュールは、ベクトル列 操作および方法のための機能のセットを含みます。 defchararrayの別名はnumpy.charです。 - つまり、doesnの形状」

In [49]: np.frompyfunc(lambda x: x.find('aa'), 1, 1)(bar) 
Out[49]: array([0, 0, -1], dtype=object) 

In [50]: np.frompyfunc(lambda x: 'aa' in x, 1, 1)(bar) 
Out[50]: array([True, True, False], dtype=object) 

さらなる試験がndarray__contains__は、アレイのflatバージョンで動作することを示唆している:私はnp.char速度はとのとほぼ同じだと思います。このような操作のために

その行動に影響を与える。

関連する問題