Arrays 如何在Python/Numpy中有效地将函数应用于笛卡尔积?
我有一个函数,我想应用于线性空间笛卡尔积的每个元素。我知道如何使用使用Arrays 如何在Python/Numpy中有效地将函数应用于笛卡尔积?,arrays,python-3.x,numpy,lambda,itertools,Arrays,Python 3.x,Numpy,Lambda,Itertools,我有一个函数,我想应用于线性空间笛卡尔积的每个元素。我知道如何使用使用lambda定义的一个变量的函数,即使用map。以下是一个例子: import numpy as np xpts = np.linspace(0, 1, 5) fun = lambda p: p**2 arr = np.array(list(map(fun , xpts))) 但是对于多变量函数,我没有使用map函数。下面是我正在做的一个例子,速度很慢: def fun(x,y): return 2*x+y xpt
lambda
定义的一个变量的函数,即使用map
。以下是一个例子:
import numpy as np
xpts = np.linspace(0, 1, 5)
fun = lambda p: p**2
arr = np.array(list(map(fun , xpts)))
但是对于多变量函数,我没有使用map
函数。下面是我正在做的一个例子,速度很慢:
def fun(x,y):
return 2*x+y
xpts = np.linspace(0, 1, 5)
# make dict of indexes
count=0
dic=dict()
for j in xpts:
dic[j]=count
count+=1
# preallocate array
arr = np.empty([len(xpts)]*2)
for tup in itertools.product(xpts, xpts):
ind1 = dic[tup[0]]
ind2 = dic[tup[1]]
val1 = tup[0]
val2 = tup[1]
arr[ind1, ind2] = fun(val1, val2)
由于我的功能复杂,空间大,我正在寻找一种高效/可扩展的方法。
map
不会让事情变得更快。在NumPy中优化函数的执行几乎总是需要一定程度的检查函数的实现,特别是它是否广播以及是否可以重写为广播。xy=np.linspace(0,1,5)。。。然后,m=np.meshgrid(xy,xy)得到一个meshgrid。然后你可以用你的函数来计算m的结果,比如。。。fun(m[1],m[0])或围绕fun(np.linspace(0,1,5)[:,None],np.linspace(0,1,10)]
交换结果是最有效的方法-当编写fun
时,它需要数组,而不是标量。谢谢@hpaulj,为了完整性,我想你的意思是fun(np.linspace(0,1,5)[:,None],np.linspace(0,1,5))
当广播这样的数组时,2个长度不必匹配。在我的示例中,结果应该是一个(5,10)数组。