如何将函数的向量映射到具有在x处评估的函数的向量

时间:2018-02-08 14:22:00

标签: python numpy

在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]

2 个答案:

答案 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循环。

xzip不具有相同维度的情况下,这两个函数的行为不同。 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]