【问题标题】:Dynamic call of a function动态调用函数
【发布时间】:2016-10-21 19:28:12
【问题描述】:

我的数组可能是 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 中做到这一点?

【问题讨论】:

  • @MooingRawr:这些是已知函数,而不是字符串命名函数。这不是远程重复。

标签: python arrays function


【解决方案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__)]()

【讨论】:

    【解决方案2】:

    如果您使用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) 将返回一个数组,其值为012。这些值表示最大值所在行中的索引。我们可以zip 数组本身的最大值来同时获取索引和行。剩下要做的就是将索引映射到要调用的函数,然后以row 作为输入调用该函数。我使用了list,但您也可以轻松使用dict

    如果更容易避免zip,你可以这样写:

    for row in arr:
        funcs[np.argmax(row)](row)
    

    这样,您一次只处理 1 行。这类似于solution posted by ShadowRanger,使用argmax 来挑选最大索引可以使解决方案更加简洁(以第3 方导入为代价)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2018-02-02
      • 2012-07-17
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多