从列表中选择一个函数并将其应用于生成数组

2024-04-19 11:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我不知道如何在标题中解释它,但下面是我要做的(Python):

我有一个初始化函数的列表,比如[foo, bar],对于每个输入,我都有一个要使用哪个函数的相关索引。现在给定一个输入数组X,索引数组I,我需要在上述条件下生成输出数组y

我的解决方案:

## These are just example methods, in reality there are complex functions
def foo(x):
    return x
def bar(x):
    return x - 1

f = [foo, bar]
X = [1, 2, 3, 1, 2, 5, 3, 6, 8, 2, 1, 4, 5, 7, 8, 1]
I = [0, 1, 0, 1, 1, 1, 1, 0, 0, 1 ,0, 0, 0, 0, 0, 1]

solution_functions = numpy.take(f, I)
solution_result = [solution_functions[idx](X[idx]) for idx in I]

我的问题是有一种更有效的方法来实现这一点——问题是如果X有数千个元素,而f中的函数非常复杂,我将创建太多的对象


Tags: 函数in标题列表returnfoodefbar
1条回答
网友
1楼 · 发布于 2024-04-19 11:51:15

您当然可以通过更改为以下内容来简化逻辑:

>>> [f[i](x) for x, i in zip(X, I)]
[1, 1, 3, 0, 1, 4, 2, 6, 8, 1, 1, 4, 5, 7, 8, 0]

请注意,如果XI的长度不同,它将截断为最短的长度

zip函数返回一个迭代器,这可能会提高内存效率。如果希望同一个昂贵的函数在同一个值上多次运行,还可以实现缓存,例如用^{}装饰函数

如果您计划在这些值之间循环,而不需要同时使用它们,则可以通过将其放在括号中而不是放在括号中使其成为生成器表达式:这只会根据需要计算每个值

相关问题 更多 >