2017-08-01 9 views
4

私は大きな整数の配列を持っており、配列内の10個の整数と対応するインデックスの最大値をペアとして出力する必要があります。PYTHON - 配列内の10個の整数の最大値を見つける

ex. (max_value, index of max_value in array) 

私は正常しかし、私はトラブル配列全体をループを備えています、最初の10の整数の内の最大値と対応するインデックスを見つけることができます。

私が使用して試してみました

a = some array of integers 

split = [a[i:i+10] for i in xrange(0, len(a), 10)] 

for i in split: 
    j = max(i) 
    k = i.index(max(i)) 
    print (j,k) 

をこの方法で問題は、それがそう(インデックスのすべてが0の間にあるMAX_VALUESが正しいですが、インデックスが不正確である10のチャンクに私の配列とを分離していることです-10。) 元のインデックスが保持されるように配列を分割しないようにする方法を見つける必要があります。私は最大値を見つけるためのループの簡単な方法があると確信していますが、私はそれを把握していないようです。

+1

修正空白はPythonでは不可欠です –

+0

あなたの配列に値の繰り返しはありますか? – depperm

+1

'enumerate'を追加してから' q * 10 + i'を実行するとインデックスを計算できます。ここでqは列挙カウンタです – depperm

答えて

3

ですから、例えば配列とデバッグを、私たちはsplitはこの1つのような2Dのリストを返すことを見つける:

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]] 

たびforループの実行を、それがために、これらのリストのうちの1つを介して行います。まず、最初の内側のリストから2番目のリストを通ります。したがって、forのループが次のリストにジャンプするたびに、単に10を追加します。リストに2つ以上のリストを含めることができるので、追加する必要がある番号変数にそれにすべてのループを10に追加します。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 
split = [a[i:i+10] for i in xrange(0, len(a), 10)] 
counter = 0 

for i in split: 
    j = max(i) 
    k = i.index(max(i)) 
    print (j,k+counter) 
    counter += 10 

することはできtest it here

1

リストを繰り返し処理するにはループスルーする必要がありますが、splitのループを変更して、効果を上げることができます。将来的には

a = some array of integers 

split = [a[i:i+10] for i in xrange(0, len(a), 10)] 

for i in range(len(split)): 
    #Now instead of being the list, i is the index, so we can use 10*i as a counter 
    j = max(split[i]) 
    #j = max(i) 
    k = split[i].index(j) + 10*i #replaced max(i) with j since we already calculated it. 
    #k = i.index(max(i)) 
    print (j,k) 

もののsplitはすでにPythonでの関数であるから、あなたのsplitリストの新しい名前を作成してください。おそらくsplit_listまたはseparatedまたはsplit()のように見えない他の名前。

+0

私はそれを理解して読んでいたので、私はちょうど私の答えにそれを追加しようとしていた –

+0

@ストリングのメソッド、ので、ストンプしない。 'whatever.split = something_else'は問題になるでしょうが、これは – Aaron

5

あなたは現在のウィンドウの前に表示される要素の数をカウントする必要があります。これは仕事を行います。

a=list(range(5,35)) 
split = [a[i:i+10] for i in xrange(0, len(a), 10)] 

for ind,i in enumerate(split): 
    j = max(i) 
    k = i.index(j) 
    print (j,k+ind*10) 

これは

(14, 9) 
(24, 19) 
(34, 29) 
5

あなたの現在のコードに小さな変更出力します

a = some array of integers 

split = [a[i:i+10] for i in xrange(0, len(a), 10)] 

for index, i in enumerate(split): 
    j = max(i) 
    k = i.index(max(i)) 
    print (j, k+10*index) 
+1

誰もが' j'を2回計算したいと思うので、毎回ちょっと気が掛かります:P(とにかく実際の影響が...) – Aaron

+0

マイクロ最適化の結果!しかし、はい、生産シナリオで 'j'を再利用するべきです。ここでは、スタックオーバーフローでは、すべての明確さと親しみについてです。 :) –

1

toolzパッケージはにシーケンスを分割partition_all機能を持っています同じサイズのタプルがあるので、このようなことをすることができます。

import toolz 
ns = list(range(25)) 
[max(sublist) for sublist in toolz.partition_all(10, ns)] 

これは[9, 19, 24]を返します。任意の入力のための

1

numpyのソリューション:

import numpy as np 

a = np.random.randint(1,21,40) #40 random numbers from 1 to 20 

b = a.reshape([4,10]) #shape into chunks 10 numbers long 

i = b.argsort()[:,-1] #take the index of the largest number (last number from argsort) 
         # from each chunk. (these don't take into account the reshape) 

i += np.arange(0,40,10) #add back in index offsets due to reshape 

out = zip(i, a[i]) #zip together indices and values 
1

あなたは一度だけ列挙し、グループにリストを分割するzipを使用してこれを簡素化することができます:

n=10 
for grp in zip(*[iter(enumerate(some_list))]*n): 
    grp_max_ind, grp_mv=max(grp, key=lambda t: t[1]) 
    k=[t[1] for t in grp].index(grp_mv) 
    print grp_mv, (grp_max_ind, k) 

使用izipのPython 2にしたい場合はジェネレータ(またはPython 3を使用)

from itertools import izip 
for grp in izip(*[iter(enumerate(some_list))]*n): 
    grp_max_ind, grp_mv=max(grp, key=lambda t: t[1]) 
    k=[t[1] for t in grp].index(grp_mv) 
    print grp_mv, (grp_max_ind, k) 

長さが0でない場合、Zipは最後のグループを切り捨てますn

1

numpyを使用する例です。

import numpy as np 
V = 1000 
L = 45 # method works with arrays not multiples of 10 
a = np.random.randint(1, V, size=L) 

今サイズNのサブアレイのための問題を解決:まずすなわち、1からVにし、長さの範囲の整数(値の数)L、のは、いくつかのデータを生成してみましょう

import numpy as np 
N = 10 # example "split" size 
sa = np.array_split(a, range(N, len(a), N)) 
sind = [np.argpartition(i, -1)[-1] for i in sa] 
ind = [np.ravel_multi_index(i, (len(sa), N)) for i in enumerate(sind)] 
vals = np.asarray(a)[np.asarray(ind)] 
split_imax = zip(vals, ind) # <-- output 
関連する問題