7

同じ基本計算を2回必要とする動的計画法アルゴリズム(修正Needleman-Wunsch)がありますが、2回目は直交方向で計算されます。たとえば、行列scoreMatrixの特定のセル(i、j)から、 (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トランスポーズが、ほんの数回の操作でトランスポーズを実行することに気付いていないいくつかの機能を使用している場合、トランスポーズは実際にはパススルー関数のアイデアよりも高速である可能性があります。誰かが私にどちらが速いか(または私が考えていなかったより良い方法があるかどうか)教えてもらえますか?

実際のメソッドはretrieveValueを3回呼び出し、参照される2つの行列を含みます(したがって、そのアプローチを使用する場合は転置されます)。

4

1 に答える 1

10

NumPyでは、転置は異なる形状とストライドのビューを返します。データには触れません。

したがって、本質的にはまったく同じであるため、2つのアプローチのパフォーマンスは同じであることがわかります。

ただし、確実にする唯一の方法は、両方をベンチマークすることです。

于 2013-01-28T20:31:35.257 に答える