我想计算其详细信息如下的递推公式,包括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)
。
有什么解决方案吗?
答案 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
我没有测试过这段代码,但相信它应该做所需要的。