我的数组可能是3X3或5X3或7X3,让我们假设以下数组:
1 1.1 1
0.9 .8 0.99
0.9 0.7 0.7
1 1 1
0.7 .5 .9
0.9 0.95 0.8
1 1 1
在每一行中我想找到最大值,如果最大值是我要调用的第一个元素function1
,如果最大值在第二位,我想调用function2
,如果最大值是在第三位,我想打电话给function3.
每行重复相同的程序。
我怎么能在python中做到这一点?
答案 0 :(得分:1)
好吧,找到最大元素的索引非常简单:
maxindex = max(range(len(row)), key=row.__getitem__)
您可以预定义一个简单的tuple
映射到三个函数:
functions = (function1, function2, function3)
将它们组合在一起,您可以将最大计算,查找和调用单行化为:
functions[max(range(len(row)), key=row.__getitem__)]()
把它放在一个循环中,你就完成了:
for row in myarray:
functions[max(range(len(row)), key=row.__getitem__)]()
答案 1 :(得分:0)
matrix = [
[1, 1.1, 1],
[0.9, .8, 0.99],
[0.9, 0.7, 0.7],
[1, 1, 1],
[0.7, .5, .9],
[0.9, 0.95, 0.8],
[1, 1, 1]
]
for row in matrix:
(f1,f2,f3)[row.index(max(row))](row)
如果你想从中创建一个新列表,你也可以使用一行:
newlist=[(f1,f2,f3)[row.index(max(row))](row) for row in matrix]
答案 2 :(得分:0)
如果您使用numpy
,使用np.argmax
会变得非常简单 - 这是一个非常直接的脚本来帮助说明用法:
import numpy as np
arr = np.array([
[1, 1.1, 1],
[0.9, .8, 0.99],
[0.9, 0.7, 0.7],
[1, 1, 1],
[0.7, .5, .9],
[0.9 , 0.95, 0.8],
[1, 1, 1]])
def func0(row):
print(0, row)
def func1(row):
print(1, row)
def func2(row):
print(2, row)
funcs = [func0, func1, func2]
for ix, row in zip(np.argmax(arr, axis=1), arr):
funcs[ix](row)
请注意,argmax(arr, axis=1)
将返回值为0
,1
或2
的数组。这些值表示最大值行中的索引。我们可以zip
数组本身的最大值来同时获取索引和行。剩下要做的唯一事情是将索引映射到要调用的函数,然后使用row
作为输入调用函数。我使用了list
,但您可以轻松使用dict
。
如果更容易避免zip
,您可以这样写:
for row in arr:
funcs[np.argmax(row)](row)
这样,您一次只能处理1行。这类似于solution posted by ShadowRanger,使用argmax
来挑选最大索引可以使解决方案更加精简(以第三方导入为代价)。