Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在Python/Numpy中有效地将函数应用于笛卡尔积?_Arrays_Python 3.x_Numpy_Lambda_Itertools - Fatal编程技术网

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)数组。