2017-02-09 12 views
1

最初の値でソートされたタプルのソートされた配列があるとします。タプルの最初の要素の条件が成立する最初のインデックスを探したい。 ie次のコードを置き換えるにはどうすればいいですか?Pythonのループをmatlabに相当するものに置き換えます。

test_array = [(1,2),(3,4),(5,6),(7,8),)(9,10)] 
min_value = 5 
index = 0 
for c in test_array: 
     if c[0] > min_value: 
      break 
     else: 
      index = index + 1 

matlabに相当するものはありますか?

つまりこのループの最後には3を得ることが期待されますが、これをより効率的にしたいと考えています。私はこれにnumpyを使って罰金を科す。私はargmaxを使ってみましたが、役に立たなかった。

おかげ

+0

はあなたが最初ではなく、条件が成立_last_インデックスを見つけたいというわけではありません。でしょうか?それはあなたがここでやっていることなので。 MATLABでこれを行う方法の簡単な例を追加して、あなたが求めていることをよりよく理解できるか? – Anonymous

答えて

4

リストはソートされているため、2番目の要素の最大可能値を知っている場合同じ第1の値を持つ1つの要素)、あなたは10000)リストにソート挿入位置を返します(タプルのリストに

import bisect 
test_array = [(1,2),(3,4),(5,6),(7,8),(9,10)] 
min_value = 5 

print(bisect.bisect_left(test_array,(min_value,10000))) 

のハードコーディングをbisectを適用する可能性があることは、あなたが整数のみを持っているので、もしあなたができる、悪いですその代わりに行います。

print(bisect.bisect_left(test_array,(min_value+1,))) 

結果:3

あなたは、このようなsys.float_info.epsilonを使用することができフロート(も整数で動作)があった場合:

print(bisect.bisect_left(test_array,(min_value*(1+sys.float_info.epsilon),))) 

複雑なので、多くの要素がある場合は単純なforループよりもはるかに優れています。

+0

私はbisectについて知らなかった。優れた!ありがとう。 – LostInTheFrequencyDomain

+0

はい、それは良いことです。私の編集を参照してください。データによっては、以前の回答が失敗する可能性があります。 –

+0

1000の代わりに2番目のパラメータとしてNoneを使用できるようです。 – LostInTheFrequencyDomain

0

あなたはすべてを見つけるしたい場合は、最初の1

import numpy 
test_array = numpy.array([(1,2),(3,4),(5,6),(7,8),(9,10)]) 
min_value = 5 

print (test_array[:,0]>min_value).argmax() 

のインデックスを取得するには、条件に従う要素を示し、その後、argmax()を使用するためにnumpyのを使用することができます条件に従う要素は、argmax()によって置き換えられます。nonzero()[0]

+0

これは残酷だと言うでしょう – Anonymous

+0

条件が成立するインデックスを希望します。さらに、これが返された(3,4)。私は(7,8)の指標を返したい。ありがとう – LostInTheFrequencyDomain

+0

申し訳ありませんが、タイプミスがありました。今すぐ動作します – yuval

0

通常、numpyのwhereは、MATLABのfindと同様の方法で使用されます。しかし、効率の観点から、I whereは、最初に見つかった要素のみを返すように制御することはできません。だから、計算上の観点からすれば、あなたがここでやっていることは間違いなく非効率的ではありません。

where同等は

index = numpy.where(numpy.array([t[0] for t in test_array]) >= min_value) 
index = index[0] - 1 
関連する問題