假设我有
n
函数 f1,...,fn
,其中每个函数采用两个相同大小的 numpy ndarray X,Y
并返回一个相同大小的 ndarray Z
。有没有一种方法可以在不使用 for 循环或列表理解的情况下创建 ndarray [f1(X,Y),...,fn(X,Y)]
?
一个人就能做到
import numpy as np
F = [f1,f2,...,fn] # list of n functions
X = np.zeros(M,N)
Y = np.zeros(X.shape)
Z = np.concatenate([f(X,Y) for f in F])
但后来我使用了循环
[f(X,Y) for f in F]
。我还考虑创建以下功能:
def F(i,X,Y):
"""
Returns fi(X,Y)
"""
return ...
然后使用类似
np.fromfunction()
之类的东西,但我不知道如何做。
函数
fi
可以是例如fi(X,Y)=X*Y**i
,因此它们之间没有依赖关系,可以并行执行。
使用示例
f(X, Y) = X*Y**i
:
import numpy as np
K, M, N = 3, 4, 5
i = np.arange(K)
X = np.zeros((M, N))
Y = np.zeros(X.shape)
Z = X*Y**i.reshape(K, 1, 1)
Z.shape # (3, 4, 5)
关键部分是将
i
重塑为与X
和Y
两个轴正交。 NumPy 使用 broadcasting 将所有数组视为具有相同的形状,从而有效地计算
i
和 X
/Y
元素的每个组合的函数。