python - numpy 更有效的子矩阵

标签 python numpy

目前我正在使用下面的代码来获取删除了第 i 行和第 j 列的子矩阵,但是在分析我的代码之后,它似乎是我代码中的主要瓶颈之一。有没有更有效的方法?

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)

编辑:Jaime 提供了一种使用正则逆和行列式来近似模逆的好方法,但是对于大基数(在我的例子中是模 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:]

瓶颈可能不是在内存中复制矩阵,而是矩阵条目访问。

最佳答案

嗯...你只是在复制矩阵,所以可能很难加快速度,但你可以尝试的一件事是验证 A 是否在连续的内存块中,这可以加快 C 的访问速度代码。看numpy.ascontiguousarray() .

关于python - numpy 更有效的子矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906607/

相关文章:

python将变量放在单引号内

python - Python 是否也有一些内置数据集(如 R)来执行测试?

python - TnT (Goloboff et al., 2008) 如何分配内部节点标签?

python - 快速核矩阵计算 python

Python极坐标图;给定数据集的每个点使用不同的颜色

python - numpy数组被切片两次

python - 如何在 Pandas DataFrame 中将 True/False 映射到 1/0?

javascript - D3 vs Scipy(Voronoi 图实现)

python - 平均负数 python

xcode 构建阶段的 Python 脚本