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

2023-12-01

为了操作 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() method

%%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 毫秒

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

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

%timeit -n3 arr = lil.toarray()

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

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


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

python/scipy/numpy中的高效增量稀疏矩阵

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

从scipy中的稀疏矩阵的每一行中有效地选择随机非零列

Also

为什么 scipy csr 矩阵的行索引比 numpy 数组慢

为什么 lil_matrix 和 dok_matrix 与常见的 dict of dicts 相比如此慢?

看看什么M.nonzero does:

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

它将矩阵转换为coo格式化并返回.row, and .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

但如果你的目标确实是一个数组,则不需要迭代

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

同样的时代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)? 的相关文章

随机推荐

  • 如何将文本拆分为单词?

    如何将文本拆分为单词 示例文本 噢 你没办法 猫说 我们都疯了 我生气了 你疯了 该行的字是 Oh you can t help that said the Cat we re all mad here I m mad You re mad
  • 为什么我必须添加Lombok插件,为什么添加依赖还不够

    我很好奇为什么我必须添加Lombok插入 为什么要添加依赖pom xml是不够的 例如Mockito 龙目岛是一个所谓的注释处理器 Mockito 只是 一个常规的 Java 库 注释处理器 定义可在 Java 代码中使用的注释 以及 当使
  • 如何在本机应用程序中处理 chrome.runtime.sendNativeMessage()

    我正在本地消息传递主机上工作 我可以使用 api 启动我的自定义应用程序 var port chrome runtime connectNative com my company my application 我可以使用 api 将消息发布
  • 通过插件命令替换 Eclipse 编辑器中选定的代码

    如何在 Eclipse 编辑器中替换选定的代码部分 通过鼠标选择选择 并仅在 selected text 通过插件 我已经设计了一个插件来在工具栏中创建一个按钮 当我单击它时 我需要它来更改所选的文本并将其放入 尝试这个片段 它应该给你足够
  • C++ 标准是否要求升级为 int?

    采取以下代码片段 short int a b 30001 c 30002 d 30003 a b c d 假设short int是16位 int是32位 这是 C 中未定义的行为吗 我对C标准的解读是b和c都必须提升为int 因此整个计算必
  • 在 VSCode 中自动在列处硬换行

    如何在 VSCode 中自动换行 我的意思是 如果一行到达指定的列 则会自动在最接近该列的单词边界处插入换行符 而不会越过 Vim 有一个设置叫做文本宽度我在编辑 Markdown 时喜欢使用它 据我所知 VSCode 似乎没有这样做 它只
  • 如何禁用 WPF 图像?

    我需要一个禁用时呈灰色的图像 IsEnabled False 可以通过将 BitmapImage 读入 FormatConvertedBitmap 来生成图像的灰色版本 如下所示here 我已经能够使用 UserControl 来实现此功能
  • 我应该如何在 Perl 中使用“my”关键字?

    我不断看到my在线示例 Perl 脚本中变量名前面的关键字 但我不知道它的含义 我尝试阅读手册页和其他在线网站 但鉴于我所看到的使用方式与手册之间的差异 我很难辨别它的用途 例如本文中用于获取数组长度的 在 Perl 中查找数组的大小 但说
  • 如何在 SQL Server 2008 中查看事务日志 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要查看数据库的事务日志SQL Server 2008为了找到删除事务并希望将其回滚 不幸的是 我不知道从哪里开始 而且我发现很难确定哪些是goo
  • 在鼠标悬停时显示 DIV

    On mouseover这个 div 可以附加到鼠标指针 以便其内容在鼠标悬停时显示吗 div style display none div 如果是的话 这是如何完成的 div abc div div that s abc div
  • UIView 动画期间的键值观察

    我正在程序中为视图的中心属性设置动画 在动画过程中 当中心达到特定值时我需要通知 我尝试将自己添加为视图中心属性的键值观察者 但是 我只有在动画开始时才会收到通知 所以我无法检测物体是否 何时通过我的兴趣点 有没有办法通过 KVO 或任何其
  • 当键盘处于活动状态时,UITextView 自动大写功能不起作用

    目前 我正在像这样的按钮目标中设置自动大写 This method is fired when keyboard is still active IBAction changeAutoCapitalization id sender sel
  • 在 Excel VBA 中解析 JSON

    我有同样的问题Excel VBA 解析的 JSON 对象循环但找不到任何解决方案 我的 JSON 具有嵌套对象 因此建议的解决方案 如 VBJSON 和 vba json 对我不起作用 我还修复了其中一个使其正常工作 但结果是由于 doPr
  • 构建淘汰模型并动态查看,未设置单选按钮

    我正在制作其中之一我之前的问题完全动态 因为模型是根据服务器数据构建的 并且视图通过淘汰赛循环遍历视图模型ko foreach功能 我面临的问题是 单选选项不会保留设置的值 即我单击操作系统 然后选择数据库选项 然后操作系统设置消失 当从属
  • 正则表达式替换浮点数中的多个句点

    如果我输入这样的内容 a1 b22 333 我希望它输出 1 22333 或 122 333 它去掉了非数字字符和任何超过 1 的句点 我对此的最佳猜测是 obj value obj value replace 0 9 1 g obj va
  • C# 处理信息时表单冻结

    我为自己编写了一个个人网络抓取工具 用于抓取艺术家信息 代码可以工作 但是当我按下按钮并开始处理 while 循环时 GUI 冻结了 我将文本框设置为 refresh 但我无法移动表格 取消程序的唯一方法就是强制退出 我正在重写这个 所以我
  • 如何使用 ARKit 和 RealityKit 检测 2D 图像

    我想使用检测二维图像ARKit and 现实套件 我不想使用 SceneKit 因为许多实现都是基于 RealityKit 的 我在 RealityKit 上找不到任何检测图像的示例 我提到https developer apple com
  • 如何使用 javascript 添加新的
  • 如何使用 onclick 中的函数将列表元素添加到现有 ul 我需要它添加到此类列表中 ul li One li li Two li li Three li ul 另一个列表项 其 id 为 element4 其下为文本 Four 我尝试了
  • shell 错误地读取在 Windows 中创建的文件

    这是我的 shell 脚本和属性文件 test sh bin bash source default properties echo app name echo app name 默认属性 app name TestApplication
  • 如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)?

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