目前我使用下面的代碼與第i行第j列去除,以獲得小矩陣,但剖析我的代碼後,它似乎是在我的代碼的主要瓶頸之一。有沒有更高效的方法?numpy的更高效的小矩陣
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在我的情況),不準確,就足以使整個事情沒有實際意義的。主要時間片似乎實際上是的GetItem在numpy的,但我相信,通過這些線路引起的:
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:]
這是可能的瓶頸並不在內存中拷貝矩陣,但矩陣條目訪問。
作爲@Bitwise指出了他的答案,沒有太多的速度高達走動內存來獲得。您可以通過在地方所做的操作數據做小至少25%的洗牌,是一種選擇?另外,你需要什麼這個子矩陣?使用子矩陣修改代碼忽略相應的行和列比實際刪除它們更容易。 – Jaime 2013-04-09 16:05:35
是否有可能產生子陣圖?我並不需要副本的副本,但我不確定是否可以隨意切片,因爲我對numpy不熟悉。 – darkfeline 2013-04-09 16:16:48
一般來說不,你不能看到子矩陣。之後你對子矩陣做什麼? – Jaime 2013-04-09 16:31:48