从列表中选择一个函数并应用它来生成一个数组

时间:2016-10-20 12:09:04

标签: python arrays numpy indexing

好的,我不知道如何在标题中解释它,但这是我想要做的(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中的函数真的很复杂,我会创建太多的对象

1 个答案:

答案 0 :(得分:3)

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

>>> [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函数返回一个迭代器,这可能会提高内存效率。如果您希望多次在相同的值上运行相同的昂贵函数,您还可以实现缓存,例如通过使用functools.lru_cache修饰函数。

如果您计划循环遍历这些值并且不需要同时使用它们,则可以通过将其放在括号中而不是括号中来将其设置为生成器表达式:这将仅根据您的需要计算每个值。