小编use*_*931的帖子

最快的方式访问和放置矩阵中的值

我写了一个程序,并一直在分析它.瓶颈如下(如果我使用稀疏矩阵):

  26534    0.775    0.000   66.657    0.003 compressed.py:638(__setitem__)
  26534    2.240    0.000   59.438    0.002 compressed.py:688(_set_many)
  13318    2.993    0.000   50.024    0.004 compressed.py:742(_insert_many)
3034231   23.087    0.000   38.101    0.000 defmatrix.py:312(__getitem__)
Run Code Online (Sandbox Code Playgroud)

如果我使用密集矩阵,那么这些操作很慢(必须将init矩阵设为零)

3034072   24.902    0.000   41.135    0.000 defmatrix.py:312(__getitem__)
  11780   19.586    0.002   19.586    0.002 {numpy.core.multiarray.zeros}
Run Code Online (Sandbox Code Playgroud)

稀疏矩阵版本更快(193秒对178秒).但检索和放入行显然是我的瓶颈.我尝试使用该take函数,我用它range()来创建一个包含行索引的数组.然而,这比我目前正在做的更糟糕(比10000倍),这对于矩阵X来说,X[idx,:]用于放置和X.getrow(idx).todense()取出.

有没有更好的方法来访问和替换这些行?我的矩阵非常大(~100000行20-500 cols).

编辑:我正在使用csr_matrix(但对任何类型的稀疏矩阵开放 - 这个似乎适合抓取行).以下是一系列测试,只是为了给出一个MWE.速度约为3E-4s,7E-3s,.1s.这对我来说是令人惊讶的,我想知道是否有一种比顶级方法更快的方法.如果我删除todense()调用稀疏时间减少一半 - 但这似乎仍然很慢.

import numpy as np
from time import time
from scipy.sparse import csr_matrix

def testFancy(mat,idxs):
    for i in idxs:
        x = mat[i,:]

def testTake(mat,idxs):
    for i in …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy sparse-matrix

5
推荐指数
1
解决办法
552
查看次数

标签 统计

numpy ×1

python ×1

scipy ×1

sparse-matrix ×1