【发布时间】:2016-02-08 19:53:39
【问题描述】:
我不确定以前是否有人问过这个问题。我在 SO 或 Google 上找不到很多相关结果。无论如何,这就是我想要做的。我有一个在运行时创建的函数,它接受 4 个参数。
my_func(t, x, p, a)
t 是一个标量浮点数。x 是一个一维 numpy 浮点数数组。p 和 a 是字典。
我有一个 numpy 数组 T 和一个 2D numpy 数组 X。我想用 T 的每个元素和 X 的每一列调用该函数,并将结果存储在另一个 numpy 数组中。该函数返回一个构成解决方案列的 numpy 数组。 我当前的、天真的、非常不合 Python 的实现如下:
for i in range(len(T)):
_u = my_func(T[i],X[:,i],p,a)
sol.u[:,i] = _u # The length of u is unrelated to the other variables
如果它允许自定义函数,我可以使用 numexpr。我还查看了 numpy.vectorize 并尝试像这样使用它:
f = np.vectorize(my_func)
f.excluded.add(2)
f.excluded.add(3)
f(T,X,p,a)
这给了我来自函数内部某处的错误“IndexError:标量变量的无效索引”。我显然不明白 numpy 广播是如何工作的。
是否可以使用 np.vectorize 做到这一点?
或者有什么方法可以使用 np.apply_along_axis?
我看到的另一种可能性是预先对数组进行切片,并形成一个具有正确参数的元组列表,并将它们与某种形式的“映射”功能一起使用。
更新:我找到的另一个解决方案:
f = lambda _t, _X: my_func(_t,_X,p,a)
u = np.array(list(map(f, T, list(X.T)))).T
它似乎工作。但这是最有效的方法吗?
更新 2: 这是一个示例函数:
def my_func(_t,_X,_p,_aux):
[x,y,v,lamX,lamY,lamV,tf,] = _X[:7]
g = _aux['const']['g']
theta = -2*atan((lamX*v + sqrt(g**2*lamV**2 - 2*g*lamV*lamY*v + lamX**2*v**2 + lamY**2*v**2))/(g*lamV - lamY*v))
return theta
_aux 的一个例子是:
_aux = {'const': {'g':-9.81} }
_t 和 _p 在这种情况下不使用。它期望 _X 是一个 7 元素向量。 在这种情况下,该函数只返回一个值。但在某些情况下,它可能会返回一个列表。在这种情况下,返回的值在输出中形成一列。希望能澄清一点。
【问题讨论】:
-
向我们展示您的功能。很有可能可以对其进行修改以接受二维数组作为
X参数并在列上广播。 -
添加了一个示例函数
标签: python numpy parallel-processing vectorization