Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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
矢量化python函数_Python_Numpy_Vectorization_Apply - Fatal编程技术网

矢量化python函数

矢量化python函数,python,numpy,vectorization,apply,Python,Numpy,Vectorization,Apply,我有一个名为old_func的旧函数,它将两个位置参数x和y作为输入。函数的输入是这样编写的,使用元组作为输入: def old_func(position): x, y = position return x**2 + y**2 我现在想要一种通过值网格调用函数的快速简便方法: xx = numpy.linspace(0, 1, 100) yy = numpy.linspace(0, 1, 100) X, Y = numpy.meshgrid(xx, yy) array

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

def old_func(position):

    x, y = position 
    return x**2 + y**2
我现在想要一种通过值网格调用函数的快速简便方法:

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)

其目的是在功能中对
x
的每个操作都在所有
x
上完成,对
y
也一样。我尝试使用矢量化函数,但不起作用。我不希望将函数更改为接受NumPy数组,因为这将花费太长的时间。

下面的代码实现了这一点,并为您省去了创建
数组位置的麻烦


首先,使用将
X
Y
展平为
(10000,)
形状的NumPy数组

然后,使用以迭代方式沿这些展平数组的长度实现自定义函数

float_array = np.apply_along_axis(old_func, 0, (X_flattened, Y_flattened))
最后,将输出数组重塑为所需的
(100100)

您自己的代码应该(并且确实)运行良好:

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)
Z.shape
现在是
(100100)

通常,numpy数组将与任何标准操作符一起工作,如
+
**
。请注意,尽管您的
old_fun
将一个元组作为输入,并且该元组需要由两个值组成,但这两个值的类型可以是任何类型,只要该类型支持数学运算符。标准Python标量和numpy数组都支持这些,因此代码运行良好


关于@JuanManuel答案的一点说明:尽管它也可以很好地工作,
apply_沿_轴
特别不适用于矢量化,因为人们通常希望使用它,即从numpy中获得良好的性能<代码>沿_轴应用_
将导致缓慢的Python循环,而不是像正确矢量化的代码那样快速的C循环。您自己的代码使用适当的矢量化,所以请使用它。

谢谢,我认为您是对的,但是由于我的
old_func
函数从技术上讲是一个单元组函数,我需要
np。沿_轴应用_(old_func,0,(X_展平,Y_展平))
对吗?是的,这是正确的!我相应地修改了答案。你是对的。嗯,我应该测试我的示例,以确保它确实给出了我实际函数所产生的原始错误。我将尝试编辑我的问题。
np.reshape(float_array, (100, 100))
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)