在numpy中是否有一种方法可以使用n
个不同函数的向量,这些函数都需要一个输入x
然后" map"这个向量到另一个向量,其中函数已被x
评估的函数替换?例如:
funcs = np.array[lambda x: 2*x for i in range(2)]
x = np.array([10,20])
y = np.evaluate_all(funcs, x)
print(y) # [20,40]
答案 0 :(得分:2)
嗯,有一种(大部分)纯Python方式使用def evaluate_all(funcs, x):
return np.array([func(val) for func, val in zip(funcs, x)])
:
numpy
使用更多numpy
的方法是使用numpy.vectorize
包装器,它允许您使用funcs
广播规则(这里简化为一次调用函数x
和@np.vectorize
def evaluate_all(f, x):
return f(x)
y = evaluate_all(funcs, x)
)中的每对项目:
evaluate_all(funcs, 10)
这有一个很好的功能,它也允许你做,例如funcs
(所以x
有一定长度,但evaluate_all(lambda x: 2*x, [10, 20])
只是一个标量)或apply
(与numpy.vectorize
相同,但可能更慢)
注意,尽管vectorize
的文档指出:
提供
for
功能主要是为了方便,而非提供 性能。实现基本上是funcs
循环。
在x
和zip
不具有相同维度的情况下,这两个函数的行为不同。 numpy
只是在较短的可迭代结束时停止,而ValueError
如果形状不兼容则会引发{{1}}。
答案 1 :(得分:1)
使用Pandas系列并申请:
funcs = np.array([lambda x: 2*x for i in range(2)])
x = np.array([10,20])
y = pd.Series(x).apply([x for x in funcs]).values[:,0 ]
print(y) # [20,40]
没有列表理解,如评论中所示:
y = pd.Series(x).apply(list(funcs)).values[:,0 ]
print(y) # [20,40]