矢量化元素

2024-03-29 08:01:10 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有可能用NumPy(和SciPy)对元素优化进行矢量化(或者加速)?你知道吗

在最抽象的意义上,我有一个函数,y,它是抛物线形状的,基本上可以表示为y=x^2+b*x+z,其中x是一个已知值的数组,我想找到一个z,使y的最小值正好为零(换句话说,我想找到一个z,使我的抛物线只有一个零)。为此,我选择实现一个简单的二等分方法。代码如下:

import numpy as np

def find_single_root():
    x = np.arange(-5, 6,0.1) # domain
    z = 1 # initial guess
    delta = 1 # initial step size
    tol = 0.001 # tolerance
    while True:
        y = x**2-5*x+z
        minimum = np.nanmin(y)
        # update z
        print(delta)
        print(z)
        if minimum > 0:
            if delta > 0:
                delta = -1*delta/2
            z += delta
        else:
            if delta < 0:
                delta = -1*delta/2
            z += delta
        # check if step is smaller than tolerance
        if np.abs(delta) < tol:
            return z

现在假设x(v,w),我想创建一个z值的2D数组,每个值都经过优化。下面是我现在看到的(注意,新的函数定义和域如下)

def find_single_root(v, w):
    x = np.arange(-5*v/w, 6*w,0.1) # domain
    ... # rest of the function

vs = np.arange(1,5)
ws = np.arange(1,5)
zs = np.zeros((len(vs),len(ws)))
for i, v in enumerate(vs):
    for j, w in enumerate(ws):
        zs[i][j] = find_single_root(v,w)

现在我有了这些简单的嵌套for循环,但是有没有一种方法可以用不同的方式来处理这个问题,或者用NumPy矢量化来加速它?你知道吗


Tags: 函数numpyforifwsnproot数组
1条回答
网友
1楼 · 发布于 2024-03-29 08:01:10

当要执行的计算被精确地预先知道时,向量化可适用。比如“取两个数字数组,两两相乘”。你知道吗

当计算适应给定数据时,矢量化不适用。任何一种优化算法都是自适应的,因为在哪里寻找最小值取决于函数返回的结果。如果你有一堆函数,并且需要找到每一个函数的最小值,你就必须一次最小化一个,在一个循环中。如果这个过程很慢,那是因为最小化一堆函数需要很长时间,而不是因为程序中有一个for循环。你知道吗

关于你的程序,我会尝试使用一些SciPy方法来最小化和寻根。有一个函数min_of_f(z),它为参数z的给定值寻找最小值,可能使用^{}。然后把min_of_f喂给root-finding routine。需要多长时间可以由它们的公差参数(xtol和其他)控制。你知道吗


操作编辑: 我想承认这是一个正确的答案,但仍然提供更多的信息。你知道吗

最后,我使用^{}对问题进行了矢量化,而没有重新构造问题。尽管numpy.vectorize并不意味着要提高性能,但在我的特定用例中,性能是一个适度的因素,比原来快了两倍。将相同的方法应用于问题中的原始问题,几乎没有加快100x100矢量的速度。你知道吗

尽管由于上述答案中给出的原因,我无法从速度方面对这个问题进行矢量化,但是能够在我的代码中使用纯矢量语法而不是嵌套for循环是非常有用的。你知道吗

相关问题 更多 >