2011-07-04 14 views
2

私は2つのnumpy配列:abを持っています。私はa == 1b == 0のすべてのインデックスを選択したいと思います。2つの条件(異なる配列にある)が真である配列のインデックスを取得する

私は、次の配列があれば、されていること:

a = [0, 1, 3, 5, 1, 1, 2] 

b = [1, 0, 2, 5, 3, 0, 6] 

を私は戻って、次のインデックスを取得したいと思います:

[1, 5] 

私はnumpyの中でこれを行う必要がありますどのように?

(a == 1 and b == 0).nonzero() 

をしかし、それはあいまいなもの真理値に関するエラーを与える:私は(numpyの、MATLABおよびIDLとの違いを示すクイックリファレンスガイドによって提案さ)以下を使用して試してみました。

アイデア?

答えて

8
In []: a= array([0, 1, 3, 5, 1, 1, 2]) 
In []: b= array([1, 0, 2, 5, 3, 0, 6]) 
In []: logical_and(a== 1, b== 0).nonzero()[0] 
Out[]: array([1, 5]) 

明らかにこれは同様に動作します:

In []: ((a== 1)& (b== 0)).nonzero()[0] 
Out[]: array([1, 5]) 
5

は、ここに1つの方法です:

In [75]: import numpy as np 

In [76]: a = np.array([0, 1, 3, 5, 1, 1, 2]) 

In [77]: b = np.array([1, 0, 2, 5, 3, 0, 6]) 

In [78]: np.argwhere((a==1) & (b==0)).flatten() 
Out[78]: array([1, 5]) 
+1

に役立ちます。 flatten() ' – Paul

0

次のコードを使用しよう:

import numpy 

a = numpy.array([0, 1, 3, 5, 1, 1, 2]) 
b = numpy.array([1, 0, 2, 5, 3, 0, 6]) 

res = [i for i,v in enumerate(zip(a,b)) if v == (1,0)] 

print res 
+0

私は投稿の過程にあったのですか?素敵で簡潔です。 –

+0

@tomc - ありがとうございます –

+0

Erm、なぜ落としたのですか?確かに、これは細かいことではありませんが、最も無作法な答えです。 –

0

を私はありませんnumpyのエラーのあるエキスパートですが、これは私がするものですあまりにも、通常のPythonのリストを行うには、おそらくあなたはここでそれを使用することができます

>>> a = [0, 1, 3, 5, 1, 1, 2] 
>>> b = [1, 0, 2, 5, 3, 0, 6] 
>>> zip(a, b) 
[(0, 1), (1, 0), (3, 2), (5, 5), (1, 3), (1, 0), (2, 6)] 
>>> for i, tup in enumerate(zip(a, b)): 
...  if tup[0]==1 and tup[1]==0: 
...   print i 
... 
1 
5 
>>> 

希望これは `WHERE`二段階` argwhere(...)を置き換えるために、ここで使用することができ

関連する問題