2016-08-25 6 views
0

から一定なインデックスを取得、私はPythonの - 私は形状と数字の配列(1220)持って配列

を返す
mask1 = [i for i in x if i>1.0 ] 

、1.0よりも大きい数字を探していますx

と呼ばれます

[1.2958354, 1.0839227, 1.1919032] 

ここで私の質問は、私の最初の配列でこれらの値のインデックス位置を決定することができますか?

私が個別に試してみたが、エラーが

list(x).index(1.2958354) 

ValueError: 1.2958354 is not in list 

答えて

1

を:

mask1 = [(i, value) for i, value in enumerate(x) if value>1.0 ] 
print mask1 
1

てみ発生します。

mask1 = [i for i in range(len(x)) if x[i]>1.0] 
1

あなたはそれぞれの値の最初のインデックスを返します。これは、xindex機能を使用することができます。 mask1試してから、すべてのインデックスのリストを取得するには、次の

map(x.index, mask1) 
1

mask_1 = [index for index, value in enumerate(x) if value > 1.0]

1

一緒インデックスと値を取得するためにenumerate()を使用してみてください:たとえば、あなたが機能を列挙使用することができます

mask1 = [(i,v) for i,v in enumerate(x) if v > 1.0] 
1

列挙型を使用してtuを作成する変数と別のリストに変数を展開するには、*演算子でzipを使用します。

a = np.array([0, 1, 2, 3]) 

idx, vals = zip(*[(i, v) for i, v in enumerate(a) if v > 1]) 

>>> idx 
(2, 3) 

>>> vals 
(2, 3) 
4

あなたはshape(ないlennumpyとしてこれをタグ付けし、説明してきました。これは、あなたが気が散った配列を持っていると思うようになります。

In [665]: x=np.random.rand(10) 
In [666]: x 
Out[666]: 
array([ 0.6708692 , 0.2856505 , 0.19186508, 0.59411697, 0.1188686 , 
     0.54921919, 0.77402055, 0.12569494, 0.08807101, 0.11623299]) 
In [667]: x>.5 
Out[667]: array([ True, False, False, True, False, True, True, False, False, False], dtype=bool) 
In [668]: list(x).index(.6708692) 
ValueError: 0.6708692 is not in list 

ValueErrorの理由は、あなたがフロートを探している、そしてそれらは多くの場合、正確に一致していないということです。配列がintの場合、そのようなインデックスが機能します。

In [669]: list(np.arange(10)).index(5) 
Out[669]: 5 

この推論は、xが配列であってもリストであっても適用されます。

numpyアレイ

In [670]: np.where(x>.5) 
Out[670]: (array([0, 3, 5, 6], dtype=int32),) 

x>.5にブール真値のインデックスを返すwhereが上記のようにブール配列であり、これが真である[0,3,5,6]インデックス値有します。

In [671]: x[np.where(x>.5)] 
Out[671]: array([ 0.6708692 , 0.59411697, 0.54921919, 0.77402055]) 

平等のテストがフロートのために任意のより良い

In [672]: x[np.where(x==0.6708692)] 
Out[672]: array([], dtype=float64) 

動作しないcloseの概念があります - の違いは、いくつかの許容範囲内である(np.allcloseは特に便利です):

In [679]: np.where(np.isclose(x,0.59411697)) 
Out[679]: (array([3], dtype=int32),) 

リストの場合、列挙型ソリューションの1つは優れており、1次元配列でも機能します。しかし、それは既に配列ですので、whereを使用してください。

関連する問題