Vectorize python函数

Dip*_*ole 3 python numpy vectorization apply

我有一个名为old的函数old_func,它将两个位置参数作为输入,x和y.使用元组作为输入,函数的输入是这样写的:

def old_func(position):

    x, y = position 
    return x**2 + y**2
Run Code Online (Sandbox Code Playgroud)

我现在想要一种通过值网格调用函数的快捷方法:

xx = numpy.linspace(0, 1, 100)
yy = numpy.linspace(0, 1, 100)
X, Y = numpy.meshgrid(xx, yy)

array_positions = (X,Y)
old_fun(array_positions)
Run Code Online (Sandbox Code Playgroud)

意图是x函数中的每个操作都在所有X和相同的上完成y.我尝试使用功能向量化,numpy.vectorize但这不起作用.我不想更改接受NumPy数组的函数,因为这需要太长时间.

Eel*_*aak 5

你自己的代码应该(并且确实)正常工作:

def old_fun(position):

    x, y = position 
    z = x**2 + y**2
    return z

xx = numpy.linspace(0,1,100)
yy = numpy.linspace(0,1,100)
X,Y = numpy.meshgrid(xx, yy)

array_positions = (X,Y)
Z = old_fun(array_positions)
Run Code Online (Sandbox Code Playgroud)

Z.shape现在(100, 100).

通常,numpy数组可以与任何标准运算符一起使用,例如+和**.请注意,虽然您old_fun将元组作为输入,并且此元组需要包含两个值,但这两个值的类型可以是任何值,只要此类型支持数学运算符即可.标准的Python标量和numpy数组都支持这些,所以代码工作正常.

关于@JuanManuel的回答的说明:尽管它的效果非常好,但在人们通常想要使用它的意义上,apply_along_axis特别是不适用于矢量化,即从numpy中获得良好的性能.apply_along_axis将导致一个缓慢的Python循环,而不是像正确矢量化代码那样的快速C循环.您自己的代码使用正确的矢量化,因此请使用它.