2017-08-01 110 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) 

這種方法的問題是,它分裂我的陣列成10塊這樣的max_values是正確的,但指標是不準確的(所有的指標都在0 -10)。 我需要找到這樣做的是使原來的索引保留不我陣列分割成塊的方式。我敢肯定有循環通過尋找最大價值的一個更簡單的方式,但我似乎無法弄清楚。

+1

修復你的間距請,空格在Python –

+0

是必不可少的做你的數組中重複的任何值? – depperm

+1

如果你添加了'enumerate',那麼可以計算索引,然後執行'q * 10 + i',其中q是枚舉計數器 – depperm

回答

3

所以用一個例子陣列的調試,我們發現split返回這樣一個二維表:

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

而且每次for循環運行,它通過這些列表中的一個才能。首先,它穿過第一內部列表,然後第二個等等。所以每次的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名單,因爲split已經在蟒蛇的功能。也許split_listseparated或者看起來不象split()功能的其他名稱。

+0

我剛剛添加到我的答案哈哈,因爲我正在閱讀我認識到 –

+0

@dawg沒有名爲split的函數..只有字符串的方法,所以沒有跺腳。 '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',並且每次都會稍微變慢一點: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) 

Zip將截斷最後一組,如果長度不是n

1

使用numpy的示例。首先,讓我們生成一些數據,即,整數範圍從1到V和長度(數值)L

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的子陣列的問題:

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 
相關問題