【发布时间】:2021-07-26 14:08:22
【问题描述】:
我有一个数字数组和一个函数列表。
我想对每个数字运行每个函数以返回一个矩阵。
有没有办法在没有慢速 python 循环/映射的情况下做到这一点?
import numpy
arr = numpy.array([1,2,3,4,5])
fns = [numpy.sin, numpy.cos, numpy.exp]
results = numpy.zeros(shape=( len(fns), len(arr) ))
for i, fn in enumerate(fns):
for j, val in enumerate(arr):
results[i][j] = fn(val)
print ('results', results)
我可以通过函数广播摆脱一个循环:
results2 = numpy.zeros(shape=( len(fns), len(arr) ))
for i, fn in enumerate(fns):
results2[i] = fn(arr)
print ('results2', results2)
有没有一些聪明的 pythonic numpy-ish 方法来摆脱我的第二个循环?
也许一些内置的外部产品交互很难用谷歌搜索?
results3 = numpy.function_outer( fns, arr)
【问题讨论】:
-
Numpy 不知道如何向量化
fns。您可以创建一个 lambda 函数并使用 numpy 的frompyfunc或apply_along_axis,但这只会稍微减慢速度。 -
我找到了与您的问题相关的链接stackoverflow.com/questions/44614254/…。
-
这不是一个正确的答案——但我意识到对于我的特定示例,sin、cos 和 exp 都属于同一个 exp(ix) 函数系列。一个聪明的实现是可以将指数函数应用于矩阵....但这对于更一般的情况是无用的。
标签: python numpy vectorization