我有一个动态规划算法(改良版 Needleman-Wunsch),需要进行相同的基本计算两次,但第二次计算是在正交方向上完成的。例如,在矩阵 scoreMatrix 中给定单元格 (i,j),我希望同时从“上面”的值和从(i,j)左侧的值中计算出一个值。为了重复使用代码,我使用了一个函数,在第一种情况下,我发送参数i,j,scoreMatrix,在下一种情况下,我发送 j,i,scoreMatrix.transpose()。这是那段代码的高度简化版本:
def calculateGapCost(i,j,scoreMatrix,gapcost):
return scoreMatrix[i-1,j] - gapcost
...
gapLeft = calculateGapCost(i,j,scoreMatrix,gapcost)
gapUp = calculateGapCost(j,i,scoreMatrix.transpose(),gapcost)
...
我意识到可以传递一个函数作为参数,以便在从scoreMatrix检索值时,在一种情况下通过参数(i,j),在另一种情况下将它们反转为(j,i),而不是每次都转置矩阵。
def passThrough(i,j,matrix):
return matrix[i,j]
def flipIndices(i,j,matrix):
return matrix[j,i]
def calculateGapCost(i,j,scoreMatrix,gapcost,retrieveValue):
return retrieveValue(i-1,j,scoreMatrix) - gapcost
...
gapLeft = calculateGapCost(i,j,scoreMatrix,gapcost,passThrough)
gapUp = calculateGapCost(j,i,scoreMatrix,gapcost,flipIndices)
...
然而,如果numpy转置使用了我不知道的某些功能来在几个操作中执行转置,那么transpose实际上可能比我的传递函数想法更快。是否有人可以告诉我哪个会更快(或者是否有我没有想到的更好的方法)?
实际方法将调用“retrieveValue”3次,并涉及到将要引用的2个矩阵(因此如果使用该方法则需要转置)。
timeit
进行测试您的实际数据可能只需要 5 分钟,如果您使用ipython
并且有%timeit
,则时间会更短。为什么不试一下呢?而不是询问别人去猜测? - abarnert