我在下面演示的简短答案是,构造新的稀疏矩阵非常昂贵.开销很大,不依赖于行数或特定行中非零元素的数量.

稀疏矩阵的数据表示形式与密集阵列的数据表示形式完全不同.数组将数据存储在一个连续的缓冲区中,并有效地使用形状和步幅来迭代选定的值.这些值加上索引定义了将在缓冲区中找到数据的确切位置.将这N个字节从一个位置复制到另一个是整个操作的相对较小的部分.

稀疏矩阵将数据存储在几个包含索引和数据的数组(或其他结构)中.然后,选择一行需要查找相关索引,并使用选定的索引和数据构造一个新的稀疏矩阵.稀疏包中有已编译的代码,但是底层代码不如numpy数组那么多.

为了说明这一点,我将制作一个小的矩阵,而不是那么密集,因此我们没有很多空行:

In [259]: A = (sparse.rand(5,5,.4,'csr')*20).floor()

In [260]: A

Out[260]:

<5x5 sparse matrix of type ''

with 10 stored elements in Compressed Sparse Row format>

密集等效项,以及一个行副本:

In [262]: Ad=A.A

In [263]: Ad

Out[263]:

array([[ 0., 0., 0., 0., 10.],

[ 0., 0., 0., 0., 0.],

[ 17., 16., 14., 19., 6.],

[ 0., 0., 1., 0., 0.],

[ 14., 0., 9., 0., 0.]])

In [264]: Ad[4,:]

Out[264]: array([ 14., 0., 9., 0., 0.])

In [265]: timeit Ad[4,:].copy()

100000 loops, best of 3: 4.58 ?s per loop

矩阵行:

In [266]: A[4,:]

Out[266]:

<1x5 sparse matrix of type ''

with 2 stored elements in Compressed Sparse Row format>

查看此csr矩阵(3个1d数组)的数据表示形式:

In [267]: A.data

Out[267]: array([ 0., 10., 17., 16., 14., 19., 6., 1., 14., 9.])

In [268]: A.indices

Out[268]: array([3, 4, 0, 1, 2, 3, 4, 2, 0, 2], dtype=int32)

In [269]: A.indptr

Out[269]: array([ 0, 2, 2, 7, 8, 10], dtype=int32)

这是选择行的方式(但在已编译的代码中):

In [270]: A.indices[A.indptr[4]:A.indptr[5]]

Out[270]: array([0, 2], dtype=int32)

In [271]: A.data[A.indptr[4]:A.indptr[5]]

Out[271]: array([ 14., 9.])

“行”是另一个稀疏矩阵,具有相同类型的数据数组:

In [272]: A[4,:].indptr

Out[272]: array([0, 2])

In [273]: A[4,:].indices

Out[273]: array([0, 2])

In [274]: timeit A[4,:]

是的,稀疏矩阵的时序很慢.我不知道实际选择数据要花费多少时间,以及构造新矩阵要花费多少时间.

10000 loops, best of 3: 145 ?s per loop

In [275]: timeit Ad[4,:].copy()

100000 loops, best of 3: 4.56 ?s per loop

lil格式可能更容易理解,因为数据和索引存储在子列表中,每行一个.

In [276]: Al=A.tolil()

In [277]: Al.data

Out[277]: array([[0.0, 10.0], [], [17.0, 16.0, 14.0, 19.0, 6.0], [1.0], [14.0, 9.0]], dtype=object)

In [278]: Al.rows

Out[278]: array([[3, 4], [], [0, 1, 2, 3, 4], [2], [0, 2]], dtype=object)

In [279]: Al[4,:].data

Out[279]: array([[14.0, 9.0]], dtype=object)

In [280]: Al[4,:].rows

Out[280]: array([[0, 2]], dtype=object)

这样的速度比较在处理紧密的编译代码时是有意义的,在这种情况下,字节从内存的一部分到另一部分的移动是大量的时间消耗者.在numpy和scipy中混合使用Python和已编译的代码,您不能仅仅计算O(n)操作.

=============================

这是从A中选择行所需的时间,以及返回新的稀疏矩阵所需的时间:

只需获取数据:

In [292]: %%timeit

d1=A.data[A.indptr[4]:A.indptr[5]]

i1=A.indices[A.indptr[4]:A.indptr[5]]

.....:

100000 loops, best of 3: 4.92 ?s per loop

加上制作矩阵所需的时间:

In [293]: %%timeit

d1=A.data[A.indptr[4]:A.indptr[5]]

i1=A.indices[A.indptr[4]:A.indptr[5]]

sparse.csr_matrix((d1,([0,0],i1)),shape=(1,5))

.....:

1000 loops, best of 3: 445 ?s per loop

尝试一个更简单的Coo矩阵

In [294]: %%timeit

d1=A.data[A.indptr[4]:A.indptr[5]]

i1=A.indices[A.indptr[4]:A.indptr[5]]

sparse.coo_matrix((d1,([0,0],i1)),shape=(1,5))

.....:

10000 loops, best of 3: 135 ?s per loop

python numpy矩阵索引_python-为什么scipy csr矩阵的行索引比numpy数组...相关推荐

  1. pandas读取csv数据、参数指定作为行索引的数据列索引列表形成复合(多层)行索引、使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的数据列)

    pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.header参数指定作为

  2. python pandas dataframe 不显示索引_Python DataFrame 设置输出不显示index(索引)值的方法...

    Python DataFrame 设置输出不显示index(索引)值的方法 在输出代码行中,加入"index=False"如下: m_pred_survived.to_csv(&q ...

  3. python dataframe去掉索引_python中pandas.DataFrame(创建、索引、增添与删除)的简单操作方法介绍...

    这篇文章python中pandas.DataFrame(创建.索引.增添与删除)的简单操作方法介绍,其中包括创建.索引.增添与删除等的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看 ...

  4. python怎么建立索引_python实现简易数据库之一——存储和索引建立

    最近没事做了一个数据库project,要求实现一个简单的数据库,能满足几个特定的查询,这里主要介绍一下我们的实现过程,代码放在过ithub,可参看这里.都说python的运行速度很慢,但因为时间比较急 ...

  5. python列表遍历索引_python遍历一个列表 前面有个索引

    如何在python列表中查找某个元素的索引 方法二:利用enumerate函数.很想你,是一种,刻骨铭心的痛!不常来,却仍深刻! python list找出一个元素的位置(重复元素怎么分别 使用lis ...

  6. python乘法表运算_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!...

    点击上方 蓝字 关注我们 Numpy提供了灵活的.静态类型的.可编译的程序接口口来优化数组的计算,也被称作向量操作,因此在Python数据科学界Numpy显得尤为重要.Numpy的向量操作是通过通用函 ...

  7. python画矩阵图_Python可视化25_seaborn绘制矩阵图

    矩阵图即用一张图绘制多个变量之间的关系,数据挖掘中常用于初期数据探索: 本文介绍python中seaborn.pairplot(傻瓜版)和seaborn.PairGrid(更个性化版)绘制矩阵图 本文 ...

  8. python符号运算卷积_Python使用scipy模块实现一维卷积运算示例

    本文实例讲述了Python使用scipy模块实现一维卷积运算.分享给大家供大家参考,具体如下: 一 介绍 signal模块包含大量滤波函数.B样条插值算法等等.下面的代码演示了一维信号的卷积运算. 二 ...

  9. python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...

    我是SymPy和Python的新手,我目前正在使用Python 2.7和SymPy 0.7.5,其目标是: a)从文本文件中读取微分方程组 b)解决系统问题 我已经阅读了this question和t ...

最新文章

  1. 【怎样写代码】参数化类型 -- 泛型(七):泛型方法
  2. java - 第一阶段总结
  3. 微软出资10亿美元研究AGI,意与谷歌竞争?
  4. 【知乎摘要】女生婚前应该清楚男友哪些方面了才能嫁给他
  5. 北向资金运作akshare
  6. screnc加密后文件不能执行_芯片加密后还能不能再次使用【详细介绍】
  7. 新增5大运维特性!华为云DAS服务高效运维有妙招
  8. 人在囧途!12306买到相同高铁票 回应:可能是机器故障
  9. python可视化库matplotlib_Python数据可视化库-Matplotlib(一)
  10. 阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理
  11. Oracle 安装报错 [INS-06101] IP address of localhost...
  12. Android 取消壁纸,android – 壁纸设置强制关闭
  13. 金蝶盘点机PDA仓库条码管理:仓库如何盘点
  14. CAJViwer安装提示:请求的操作需要提升
  15. 关于《论文写作》课程的心得和体会
  16. surface pro 写php,surface pro7尺寸
  17. Android 抛弃原生MediaPlayer 使用音频框架 StarrySky
  18. P2006 赵神牛的游戏
  19. 计算机二级两个控件之间求偶,求,全国计算机等级考试二级java历年试题及答案合集,还有上机考试真题?...
  20. ARM汇编指令(B/BL/BX)

热门文章

  1. 数据结构实验之链表三:链表的逆置
  2. 顺序表应用4-2:元素位置互换之逆置算法(数据改进)
  3. 用户请求接口信息日志记录
  4. 【C++】40. std::array与int a[]方式创建数组的区别
  5. Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
  6. GitLab远程仓库迁移
  7. 《UNIXLinux程序设计教程》一第2章-2.0 标准输入输出
  8. 高考题(可作为试讲资料)
  9. Self Service Password (SSP)
  10. sass 在线转换器