如何计算递归公式,包括用numpy最小化?

时间:2018-05-09 03:23:34

标签: python numpy

我想计算其详细信息如下的递推公式,包括numpy的最小化。另外,由于计算时间的原因,我不想使用numpy的参考。

以下是我要计算的递推公式:(DTW) (*)

g[i,j] = d[i,j] + min(g[i-1,j],g[i-1,j-1],g[i-1,j-2])

我尝试使用"计算(*)for循环",然后计算时间约为2分钟!尽管g.shape =(2000,2000)...... 代码如下:

indexes = [[-1,0],[-1,-1],[-1,-2]] # for genelize

for i in range(1, g_rows):
    for j in range(g_cols):
        tmp = np.zeros(len(indexes))
        for k in range(len(indexes)):
            i_ = i + indexes[k][0]
            j_ = j + indexes[k][1]
            if i_ >= 0 and i_ < g_rows and j_ >= 0 and j_ < g_cols:
                tmp[k] = d[i,j] + g[i_,j_]
            else:
                tmp[k] = np.nan 

        g[i,j] = np.nanmin(tmp)

        for ~ # back tracking for DTW 

因此,我想比上面的代码做得更快。我认为这段代码太多了......

如果它是一个简单的递推公式:

a[i,j] = u[i+1,j] - u[i,j] + u[i,j+1] - u[i,j]

然后使用切片(a)

a =  u[1:,0:-1] - u[0:-1,0:-1] + u[0:-1,1:] -u[0:-1,0:-1]

我想像(*)一样计算(a)。 有什么解决方案吗?

1 个答案:

答案 0 :(得分:0)

看起来这本质上是一个迭代算法,因此您可能无法将其全部作为单个向量运算。但是,因为每列中的每个元素都是独立计算的,所以你可以通过矢量化每行计算来加快速度:

g = np.zeros(d.shape) 
g[0, :] = d[0, :]
for i in range(1, d.shape[0]):
    g[i, 0] = d[i, 0] + g[i-1, 0]  # Edge condition for column 0
    g[i, 1] = d[i, 1] + np.minimum(g[i-1, 0], g[i-1, 1])  # Edge condition for column 1
    g[i, 2:] = d[i, 2:] + np.minimum.reduce([g[i-1,2:], g[i-1,1:-1], g[i-1,:-2]])  # Do remaining columns in single operation

我没有测试过这段代码,但相信它应该做所需要的。