2016-09-07 108 views
-4

獲取分鐘我有這種結構Python中的多陣列:在多陣列蟒蛇

[[0, 0, 2000, 0.2, 25, 0.39784217, 0.40575236], [0, 0, 2000, 0.2, 50, 
    0.31941691, 0.38137865], [0, 0, 2000, 0.2, 75, 0.2767137, 0.41646746], ... 

,我需要得到什麼陣列最低限度的包含在六,七場

例如,在三個數組[0, 0, 2000, 0.2, 75, 0.2767137, 0.41646746]包含六個字段中的最小值,並且[0, 0, 2000, 0.2, 50, 0.31941691, 0.38137865]包含七個字段中的最小值

非常感謝!

注意,Andres。

+0

你能否提供實際的代碼而不是複製數組?你能指定「六七領域」的意思嗎? – Ian

回答

1

這將做(使用min()key參數):

#Suppose a is the multiarray 
>>> min(a, key=lambda x: x[5])    # <- x[5] is the 6th field 
[0, 0, 2000, 0.2, 75, 0.2767137, 0.41646746] 
>>> min(a, key=lambda x: x[6])    # <- x[6] is the 7th field 
[0, 0, 2000, 0.2, 50, 0.31941691, 0.38137865] 

(下一次請澄清你的問題,並提供mcve

+0

'operator.itemgetter(5)'可以在這裏用來代替'lambda x:x [5]'。我認爲這種方式並不明顯,但我也認爲這是'itemgetter'唯一明智的用例! – Eric

+0

@Eric你當然是對的,但我個人並沒有看到使用'itemgetter'的好處,並總是忘了它的正確名稱:( –

0

在這裏你去,如果你不介意使用numpy的。

import numpy as np 

def custom_get_min(multiarray, field): 
    idx = np.argmin([item[field] for item in multiarray]) 
    return multiarray[idx] 

min6 = custom_get_min(multiarray, 5) # 5 is the 6th field 
min7 = custom_get_min(multiarray, 6) # 6 is the 7th field 

正如評論中所建議的那樣,這個解決方案不是很高效。 調用multiarray[:, field].argmin()約快兩個數量級。

import time 
a = np.random.rand(300, 300) 

# List comprehension 
start = time.time() 
for i in range(1000): 
    np.argmin([item[200] for item in a]) 
end = time.time() 
print(end - start) 

# Numpy argmin 
start = time.time() 
for i in range(1000): 
    a[a[:, 200].argmin()] 
end = time.time() 
print(end - start) 

# Built-in min 
b = a.tolist() 
start = time.time() 
for i in range(1000): 
    min(b, key=lambda x: x[200]) 
end = time.time() 
print(end - start) 

# Results 
0.147596120834 
0.00218319892883 
0.0637719631195 
+1

爲什麼這會得到downvoted? – dangom

+0

不是我downvote,但一個numpy解決方案那麼產生O(N)列表的理解並不理想 – Eric

+0

你是對的Thx – dangom

0
array = [[0, 0, 2000, 0.2, 25, 0.39784217, 0.40575236], 
    [0, 0, 2000, 0.2, 50, 0.31941691, 0.38137865], 
    [0, 0, 2000, 0.2, 75, 0.2767137, 0.41646746] 
    ] 

min_fields = [] 

for i in range(len(array[0])): 
    field_col = [row[i] for row in array] 
    min_row = field_col.index(min(field_col)) 
    min_fields.append([i, min_row]) 

這將循環遍歷每個列(假設所有的行具有相等長度)。 然後它會生成一個新的數組,它是感興趣的列(第i列)。 然後它將找到該數組中最低值的索引,該數組是包含該值的行。最後它會將結果附加到預定義的結果數組中。 結果看起來像這樣:

[[0, 0], [1, 0], [2, 0], [3, 0], [4, 0], [5, 2], [6, 1]] 

在每個子陣列中,第一元件表示列和第二元件表示包含該列中的最低值的行。在最低值相同的情況下,它將選擇索引最低的行。

如果你只是想從1行得到這樣的信息:

col_index = 6 
col = [row[col_index] for row in array] 
min_row = col.index(min(col)) 

這裏min_row是包含列COL_INDEX的最低值的行。

1

這裏有一個更好的方式來使用numpy的,不涉及一個for循環:

data = np.array([ 
    [0, 0, 2000, 0.2, 25, 0.39784217, 0.40575236], 
    [0, 0, 2000, 0.2, 50, 0.31941691, 0.38137865], 
    [0, 0, 2000, 0.2, 75, 0.2767137, 0.41646746], 
    ... 
]) 
has_6_min = data[:,5].argmin() 
has_7_min = data[:,6].argmin() 
print(data[has_6_min]) 
print(data[has_7_min]) 

你可能要考慮使用numpy的的結構化或記錄陣列在這裏,所以你可以給有意義的名稱到第六和第七場。 pandas也可能與您的問題有關。

+0

要慢。這要快得多嗎?你是否需要遍歷列表中的所有元素,即O(n)? – dangom

+0

複雜性可能是相同的,但我認爲調用'iter'和在列表理解中重複'next'。你是否在說,你對它進行了描述,而且速度更快,或者挑戰假定速度更快的假設? – Eric