获得多阵列python的最小值

时间:2016-09-07 09:00:53

标签: python arrays numpy

我在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]包含七个字段中的最小值

非常感谢!

注意,安德烈斯。

4 个答案:

答案 0 :(得分:1)

那样做(使用带有key参数的min()):

#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

答案 1 :(得分: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也可能与您的问题有关。

答案 2 :(得分: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

答案 3 :(得分: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 的最低值的行。