2番目の列が4または6に等しい行をフェッチする方法はありますか。numpy:一連の条件に基づいて行を選択する方法
a = np.array(np.mat('1 2; 3 4; 5 6; 7 4'))
b = [4,6]
どうやら、これは動作しません:
c = a[a[:,1] in b]
2番目の列が4または6に等しい行をフェッチする方法はありますか。numpy:一連の条件に基づいて行を選択する方法
a = np.array(np.mat('1 2; 3 4; 5 6; 7 4'))
b = [4,6]
どうやら、これは動作しません:
c = a[a[:,1] in b]
あなたがitertools.ifilter
を使用することができます。
from itertools import ifilter
c = np.array([ e for e in ifilter(lambda x: x[1] in b, a) ])
>> array([[3,4],
[5,6],
[7,4]])
[xについてxと、4,6(であればX [1]に)]あなたが言及した場合のためにそれを行う必要があります。
編集:@georgeslが示唆しているように、文字列に対してnumpy.matメソッドを使用するのではなく、配列の作成中にイテレータを正しく使用することが理想的です。
georgeslの答えと同じ反対意見:NumPyのベクトル化操作を使用しないため、これは不必要に遅くなります。 –
larsmansこのような操作に最適化されていないことについての有効な懸念事項である限り、@ georgeslのコメントが有効なので有効です。 OPは、大きなアレイの使用について明示的に指示していません。 – techiev2
あなたは行うことができます:あなたはまた、論理演算子or
ため|
を使用することができます
check = np.logical_or(a[:,1]==4, a[:,1]==6)
c = a[check,:]
:
check = (a[:,1]==4) | (a[:,1]==6)
だろうこれを行うnumpythonic方法はin1d
を使用するために、何かのように:
a[np.in1d(a[:, 1], b)]
これは、大きなアレイでは非常に遅いです。 NumPy配列を扱うときは、ベクトル化されたイディオムが望ましいでしょう。 –
OPは大きな配列を使用していますか? Big Dataで作業することなく、Numpyを広く使用しています。 – lucasg