我有一个动态规划算法(修改的 Needleman-Wunsch),它需要两次相同的基本计算,但第二次计算是在正交方向上完成的。例如,从矩阵 scoreMatrix 中的给定单元格 (i,j),我想从 (i,j) 的“向上”值计算值,以及从值到 (i,j) 的值计算值,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 个将被引用的矩阵(如果使用该方法,则因此转置)。

最佳答案

在 NumPy 中,转置返回具有不同形状和 strides 的 View 。它不涉及数据。

因此,您可能会发现这两种方法具有相同的性能,因为它们本质上完全相同。

但是,唯一可以确定的方法是对两者进行基准测试。

关于python - 哪个更快,numpy 转置或翻转索引?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14570513/

10-12 23:30