目前我使用下面的代码与第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