【问题标题】:Vectorize python function向量化python函数
【发布时间】:2015-10-11 02:43:58
【问题描述】:

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

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.vectorize 对函数进行矢量化,但这不起作用。我不希望将函数更改为接受 NumPy 数组,因为这将花费太长时间。

【问题讨论】:

    标签: python numpy vectorization apply


    【解决方案1】:

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

    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 现在是(100, 100)

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

    关于@JuanManuel 回答的注释:虽然它也可以正常工作,但apply_along_axis 特别不适用于矢量化,因为人们通常希望使用它,即获得良好的性能麻木的。 apply_along_axis 将导致缓慢的 Python 循环,而不是像正确矢量化代码那样的快速 C 循环。您自己的代码使用了适当的矢量化,因此请改用它。

    【讨论】:

    • 你是对的。嗯,我应该测试我的示例以确保它确实给出了我的实际函数所做的原始错误。我会尝试编辑我的问题。
    【解决方案2】:

    下面的代码可以解决问题,省去了创建array_positions 的麻烦。


    首先,使用ravelXY 扁平化为形状为(10000,) 的NumPy 数组。

    X_flattened = X.ravel()
    Y_flattened = Y.ravel()
    

    然后,使用apply_along_axis 沿这些展平数组的长度迭代地实现自定义函数。

    float_array = np.apply_along_axis(old_func, 0, (X_flattened, Y_flattened))
    

    最后,将输出数组重新整形为(100, 100)的所需形状。

    np.reshape(float_array, (100, 100))
    

    【讨论】:

    • 谢谢,我认为你是对的,但是由于我的 old_func 函数在技术上是一个单一元组的函数,我需要 np.apply_along_axis(old_func, 0, (X_flattened, Y_flattened)) 对吗?
    • 是的,没错!我相应地修改了答案。
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多