我在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]
包含七个字段中的最小值
非常感谢!
注意,安德烈斯。
答案 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 的最低值的行。