Iはnp.where条件にしてサブストリングを含む配列のエントリを見つけることを試みた:numpy配列に部分文字列を含むエントリを検索していますか?
import numpy as np
foo = "aa"
bar = np.array(["aaa", "aab", "aca"])
np.where(foo in bar)
これが唯一の空の配列を返します。
なぜそうですか?
良い代替ソリューションがありますか?
Iはnp.where条件にしてサブストリングを含む配列のエントリを見つけることを試みた:numpy配列に部分文字列を含むエントリを検索していますか?
import numpy as np
foo = "aa"
bar = np.array(["aaa", "aab", "aca"])
np.where(foo in bar)
これが唯一の空の配列を返します。
なぜそうですか?
良い代替ソリューションがありますか?
あなたが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]
我々が見つからない場合は-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])
ルック:
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
速度はとのとほぼ同じだと思います。このような操作のために
その行動に影響を与える。
これは完全に機能します。どうもありがとうございました!しかし、好奇心の中で、なぜnp.whereの状態が悪いのか分かりますか? – SiOx
@SiOx AFAIK 'foo'はNumPy配列であり、' in'では動作しません。その 'in'はPythonのリストなどに意味があるのでしょうか? – Divakar
'in'は配列で動作します。つまり、' ndarray'は '__contains__'メソッドを持っています。しかし、行動はリストと同様です。 – hpaulj