回答:
括弧を追加すると、式が機能します。
>>> y[(1 < x) & (x < 5)]
array(['o', 'o', 'a'],
dtype='|S1')
&
は<
およびよりも優先順位が高く、さらに>
(論理)よりも優先順位が高くなりand
ます。x > 1 and x < 5
最初に不等式を評価し、次に論理結合を評価します。and(の値)x > 1 & x < 5
のビット単位の結合を評価し、次に不等式を評価します。不等式が最初に評価されるように強制するため、すべての操作は意図した順序で行われ、結果はすべて明確に定義されています。こちらのドキュメントをご覧ください。1
x
(x > 1) & (x < 5)
(0 < x) & (x < 10)
(回答に示されているように)。代わり0 < x < 10
に、Pythonのどのバージョンのnumpy配列でも機能しません。
IMO OPは実際にはnp.bitwise_and()
(別名&
)は必要ありませんがnp.logical_and()
、True
and などの論理値を比較しているため、実際に必要です。違いを確認するには、論理対ビットごとのFalse
このSOの投稿を参照してください。
>>> x = array([5, 2, 3, 1, 4, 5])
>>> y = array(['f','o','o','b','a','r'])
>>> output = y[np.logical_and(x > 1, x < 5)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
これを行う同等の方法はnp.all()
、axis
引数を適切に設定することです。
>>> output = y[np.all([x > 1, x < 5], axis=0)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
数字で:
>>> %timeit (a < b) & (b < c)
The slowest run took 32.97 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 1.15 µs per loop
>>> %timeit np.logical_and(a < b, b < c)
The slowest run took 32.59 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.17 µs per loop
>>> %timeit np.all([a < b, b < c], 0)
The slowest run took 67.47 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.06 µs per loop
その使用はnp.all()
遅いですが、&
とlogical_and
ほぼ同じです。
output = y[np.logical_and(x > 1, x < 5)]
、x < 5
されている評価関数の外起こるので、それは、第二引数のにもかかわらず、(おそらく莫大なアレイを作成する)を評価。IOW、logical_and
2つの評価済みの引数が渡されます。これは通常の場合とは異なりa and b
いる、b
あれば評価されないa
truelikeです。
@JF Sebastianと@Mark Mikofskiの回答に1つの詳細を追加し
ます。(配列の実際の値ではなく)対応するインデックスを取得したい場合は、次のコードを実行します。
複数(すべて)の条件を満たす場合:
select_indices = np.where( np.logical_and( x > 1, x < 5) )[0] # 1 < x <5
複数の(または)条件を満たす場合:
select_indices = np.where( np.logical_or( x < 1, x > 5 ) )[0] # x <1 or x >5
(the array of indices you want,)
、必要なselect_indices = np.where(...)[0]
結果を取得する必要があります。そして期待しています。
私np.vectorize
はそのような仕事に使うのが好きです。以下を検討してください。
>>> # Arrays
>>> x = np.array([5, 2, 3, 1, 4, 5])
>>> y = np.array(['f','o','o','b','a','r'])
>>> # Function containing the constraints
>>> func = np.vectorize(lambda t: t>1 and t<5)
>>> # Call function on x
>>> y[func(x)]
>>> array(['o', 'o', 'a'], dtype='<U1')
利点は、ベクトル化された関数にさらに多くのタイプの制約を追加できることです。
それが役に立てば幸い。
2D配列の場合、これを行うことができます。条件を使用して2Dマスクを作成します。配列に応じて、条件マスクをintまたはfloatに型キャストし、元の配列と乗算します。
In [8]: arr
Out[8]:
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.]])
In [9]: arr*(arr % 2 == 0).astype(np.int)
Out[9]:
array([[ 0., 2., 0., 4., 0.],
[ 6., 0., 8., 0., 10.]])