2016-09-07 6 views
-4

に分を取得し、私はPythonでこのように構成されたマルチアレイがあります。マルチアレイの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], ... 

をそして私は、アレイは、例えば6および7フィールド

にminimunに含まいただきました取得する必要があります上記の3つの配列[0, 0, 2000, 0.2, 75, 0.2767137, 0.41646746]は6フィールドに最小値を含み、[0, 0, 2000, 0.2, 50, 0.31941691, 0.38137865]は7フィールドに最小値を含む

ありがとう、ありがとう!

Regard、Andres。 (key引数でmin()を使用して)くださいます

+0

配列をコピーする代わりに実際のコードを入力してください。そして、あなたは「6と7のフィールド」で何を意味するのかを指定できますか? – Ian

答えて

1

#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

'lambda x:x [5]'の代わりに 'operator.itemgetter(5)'を使うことができます。私はそれがそのようにはっきりしているとは思わないが、私はitemgetterにとって賢明なユースケースだとも思う! – Eric

+0

@Ericあなたは当然ですが、個人的には、「itemgetter」を使用する利点はありませんし、常に正しい名前を忘れてしまいました:( –

0

ここでは、使用して気にしない場合は、行きます数が少ない。

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()を呼び出すのは約2桁高速です。

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

なぜこれが下降していますか? – dangom

+0

私のdownvoteではなく、 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]] 

、最初の要素は列を表し、第2の要素は、その列の最小値を含む行を表します。等しい最小値の場合、最も低いインデックスの行が選択されます。

あなただけの1行からこの情報を取得したい場合:

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

ここmin_row列col_indexの最低値を含む行です。ここで

1

は、forループを含まないnumpyのを使用するためのより良い方法です:

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のの構造化またはレコードの配列を使用してに見たいと思うかもしれません第6および第7フィールド。 pandasもあなたの問題に関連している可能性があります。

+0

なぜでしょうか?とにかく、O(n)? – dangom

+0

複雑さはおそらく同じですが、私は 'iter'を呼び出すためにかなりのオーバーヘッドがあると思います。リストの理解の中で 'next 'を繰り返し実行します。あなたはそれをプロファイリングしていると言っていますか、それははるかに速いですか、それがより高速であると主張することに挑戦していますか? – Eric

関連する問題