我正在编写一个numpy / cython程序来计算小矩阵的未成年人(很多)。
我当前的函数看起来像(计算mat wrt。到第ii行,col jj的小调):
cdef float minor(np.ndarray[DTYPE_t, ndim = 2] mat,int ii,int jj):
rows = range(mat.shape[0])
col = range(mat.shape[0])
del rows[ii]
del col[jj]
cdef np.ndarray[DTYPE_t, ndim = 2] rM = (mat[rows])[:,col]
cdef float val = (-1)**(ii+jj) * np.linalg.det(rM)
return val
经过一点基准测试后,该行
cdef np.ndarray[DTYPE_t, ndim = 2] rM = (mat[rows])[:,col]
相当耗时。有没有更好的方法从二维数组中删除一行和一列?
此致,
cp3028
答案 0 :(得分:1)
看起来你正在从(mat[rows])[:,col]
复制内存,分配和复制是一个缓慢的过程。是不是可以简单地在np.linalg.deg
的块上调用函数mat
,而不是复制它并计算副本上的行列式?