gpt4 book ai didi

python - 如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)?

转载 作者:行者123 更新时间:2023-11-28 16:25:39 46 4
gpt4 key购买 nike

要操作 Scipy 矩阵,通常会使用内置方法。但有时您需要读取矩阵数据以将其分配给非稀疏数据类型。为了演示,我创建了一个随机的 LIL 稀疏矩阵,并使用不同的方法将其转换为 Numpy 数组(纯 Python 数据类型会更有意义!)。

from __future__ import print_function
from scipy.sparse import rand, csr_matrix, lil_matrix
import numpy as np

dim = 1000
lil = rand(dim, dim, density=0.01, format='lil', dtype=np.float32, random_state=0)
print('number of nonzero elements:', lil.nnz)
arr = np.zeros(shape=(dim,dim), dtype=float)

非零元素的数量:10000

索引阅读

%%timeit -n3
for i in xrange(dim):
for j in xrange(dim):
arr[i,j] = lil[i,j]

3 个循环,3 个循环中的最佳:每个循环 6.42 秒

使用nonzero()方法

%%timeit -n3
nnz = lil.nonzero() # indices of nonzero values
for i, j in zip(nnz[0], nnz[1]):
arr[i,j] = lil[i,j]

3 个循环,3 个循环中的最佳:每个循环 75.8 毫秒

使用内置方法直接转换为数组

这个不是读取矩阵数据的通用解决方案,因此不算作解决方案。

%timeit -n3 arr = lil.toarray()

3 个循环,3 个循环中的最佳:每个循环 7.85 毫秒

用这些方法读取 Scipy 稀疏矩阵根本没有效率。有没有更快的方法来读取这些矩阵?

最佳答案

一个类似的问题,但处理设置稀疏值,而不是仅仅读取它们:

Efficient incremental sparse matrix in python / scipy / numpy

更多关于使用底层表示访问值的信息

Efficiently select random non-zero column from each row of sparse matrix in scipy

还有

why is row indexing of scipy csr matrices slower compared to numpy arrays

Why are lil_matrix and dok_matrix so slow compared to common dict of dicts?

看看 M.nonzero 做了什么:

    A = self.tocoo()
nz_mask = A.data != 0
return (A.row[nz_mask],A.col[nz_mask])

它将矩阵转换为 coo 格式并返回 .row.col 属性 - 在过滤掉任何“杂散”0 之后在 .data 属性中。

因此您可以跳过中间人并直接使用这些属性:

 A = lil.tocoo()
for i,j,d in zip(A.row, A.col, A.data):
a[i,j] = d

这几乎和 toarray 一样好:

In [595]: %%timeit
.....: aa = M.tocoo()
.....: for i,j,d in zip(aa.row,aa.col,aa.data):
.....: A[i,j]=d
.....:
100 loops, best of 3: 14.3 ms per loop

In [596]: timeit arr=M.toarray()
100 loops, best of 3: 12.3 ms per loop

但是如果你的target真的是一个数组,就不需要迭代了

In [603]: %%timeit
.....: A=np.empty(M.shape,M.dtype)
.....: aa=M.tocoo()
.....: A[aa.row,aa.col]=aa.data
.....:
100 loops, best of 3: 8.22 ms per loop

我对@Thoran 的 2 种方法的时间是:

100 loops, best of 3: 5.81 ms per loop
100 loops, best of 3: 17.9 ms per loop

同样的时间。

关于python - 如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013115/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com