現在、以下のコードを使用して i 番目の行と j 番目の列を削除した部分行列を取得していますが、コードをプロファイリングした後、コードの主なボトルネックの 1 つと思われます。より効率的な方法はありますか?
def submatrix(A, i, j):
logger.debug('submatrix(%r, %r, %r)', A, i, j)
B = empty(shape=tuple(x - 1 for x in A.shape), dtype=int)
B[:i, :j] = A[:i, :j]
B[i:, :j] = A[i+1:, :j]
B[:i, j:] = A[:i, j+1:]
B[i:, j:] = A[i+1:, j+1:]
return B
25015049 function calls (24599369 primitive calls) in 44.587 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
3983040 15.541 0.000 20.719 0.000 defmatrix.py:301(__getitem__)
415680 10.216 0.000 33.069 0.000 hill.py:127(submatrix)
415686/6 3.232 0.000 44.578 7.430 hill.py:112(det)
編集: ハイメは通常の逆数と行列式を使用してモジュラー逆数を近似する良い方法を提供しましたが、大きなベース (私の場合はモジュロ 256) では、不正確さは全体を無意味なものにするのに十分です. 主なタイム シンクは、実際には numpy の getitem のように見えますが、次の行が原因であると考えています。
B[:i, :j] = A[:i, :j]
B[i:, :j] = A[i+1:, :j]
B[:i, j:] = A[:i, j+1:]
B[i:, j:] = A[i+1:, j+1:]
ボトルネックがメモリ内での行列のコピーではなく、行列エントリへのアクセスである可能性があります。