python numpy矩阵索引_python-为什么scipy csr矩阵的行索引比numpy数组...
我在下面演示的简短答案是,构造新的稀疏矩阵非常昂贵.开销很大,不依赖于行数或特定行中非零元素的数量.
稀疏矩阵的数据表示形式与密集阵列的数据表示形式完全不同.数组将数据存储在一个连续的缓冲区中,并有效地使用形状和步幅来迭代选定的值.这些值加上索引定义了将在缓冲区中找到数据的确切位置.将这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数组...相关推荐
- pandas读取csv数据、参数指定作为行索引的数据列索引列表形成复合(多层)行索引、使用set_index函数把数据列转化为行索引(keys参数指定需要被转化的数据列)
pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.header参数指定作为
- python pandas dataframe 不显示索引_Python DataFrame 设置输出不显示index(索引)值的方法...
Python DataFrame 设置输出不显示index(索引)值的方法 在输出代码行中,加入"index=False"如下: m_pred_survived.to_csv(&q ...
- python dataframe去掉索引_python中pandas.DataFrame(创建、索引、增添与删除)的简单操作方法介绍...
这篇文章python中pandas.DataFrame(创建.索引.增添与删除)的简单操作方法介绍,其中包括创建.索引.增添与删除等的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看 ...
- python怎么建立索引_python实现简易数据库之一——存储和索引建立
最近没事做了一个数据库project,要求实现一个简单的数据库,能满足几个特定的查询,这里主要介绍一下我们的实现过程,代码放在过ithub,可参看这里.都说python的运行速度很慢,但因为时间比较急 ...
- python列表遍历索引_python遍历一个列表 前面有个索引
如何在python列表中查找某个元素的索引 方法二:利用enumerate函数.很想你,是一种,刻骨铭心的痛!不常来,却仍深刻! python list找出一个元素的位置(重复元素怎么分别 使用lis ...
- python乘法表运算_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!...
点击上方 蓝字 关注我们 Numpy提供了灵活的.静态类型的.可编译的程序接口口来优化数组的计算,也被称作向量操作,因此在Python数据科学界Numpy显得尤为重要.Numpy的向量操作是通过通用函 ...
- python画矩阵图_Python可视化25_seaborn绘制矩阵图
矩阵图即用一张图绘制多个变量之间的关系,数据挖掘中常用于初期数据探索: 本文介绍python中seaborn.pairplot(傻瓜版)和seaborn.PairGrid(更个性化版)绘制矩阵图 本文 ...
- python符号运算卷积_Python使用scipy模块实现一维卷积运算示例
本文实例讲述了Python使用scipy模块实现一维卷积运算.分享给大家供大家参考,具体如下: 一 介绍 signal模块包含大量滤波函数.B样条插值算法等等.下面的代码演示了一维信号的卷积运算. 二 ...
- python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...
我是SymPy和Python的新手,我目前正在使用Python 2.7和SymPy 0.7.5,其目标是: a)从文本文件中读取微分方程组 b)解决系统问题 我已经阅读了this question和t ...
最新文章
- 【怎样写代码】参数化类型 -- 泛型(七):泛型方法
- java - 第一阶段总结
- 微软出资10亿美元研究AGI,意与谷歌竞争?
- 【知乎摘要】女生婚前应该清楚男友哪些方面了才能嫁给他
- 北向资金运作akshare
- screnc加密后文件不能执行_芯片加密后还能不能再次使用【详细介绍】
- 新增5大运维特性!华为云DAS服务高效运维有妙招
- 人在囧途!12306买到相同高铁票 回应:可能是机器故障
- python可视化库matplotlib_Python数据可视化库-Matplotlib(一)
- 阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理
- Oracle 安装报错 [INS-06101] IP address of localhost...
- Android 取消壁纸,android – 壁纸设置强制关闭
- 金蝶盘点机PDA仓库条码管理:仓库如何盘点
- CAJViwer安装提示:请求的操作需要提升
- 关于《论文写作》课程的心得和体会
- surface pro 写php,surface pro7尺寸
- Android 抛弃原生MediaPlayer 使用音频框架 StarrySky
- P2006 赵神牛的游戏
- 计算机二级两个控件之间求偶,求,全国计算机等级考试二级java历年试题及答案合集,还有上机考试真题?...
- ARM汇编指令(B/BL/BX)
热门文章
- 数据结构实验之链表三:链表的逆置
- 顺序表应用4-2:元素位置互换之逆置算法(数据改进)
- 用户请求接口信息日志记录
- 【C++】40. std::array与int a[]方式创建数组的区别
- Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
- GitLab远程仓库迁移
- 《UNIXLinux程序设计教程》一第2章-2.0 标准输入输出
- 高考题(可作为试讲资料)
- Self Service Password (SSP)
- sass 在线转换器