python 的csr_python的高级数组之稀疏矩阵

稀疏矩阵的定义:

具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。

稀疏矩阵的两个动机:稀疏矩阵通常具有很大的维度,有时甚大到整个矩阵(零元素)与可用内存不想适应;另一个动机是避免零矩阵元素的运算具有更好的性能。

稀疏矩阵的格式

存储矩阵的一般方法是采用二维数组,其优点是可以随机地访问每一个元素,因而能够容易实现矩阵的各种运算。对于稀疏矩阵,采用二维数组的存储方法既浪费大量的存储单元来存放零元素,又要在运算中浪费大量的时间来进行零元素的无效运算。因此必须考虑对稀疏矩阵进行压缩存储(只存储非零元素)。

Scipy.sparse模块提供了许多来自于稀疏矩阵的不同存储格式。这里仅描述最为重要的格式CSR、CSC和LIL。CSR、CSC是用于矩阵-矩阵和矩阵-向量运算的有效格式,LIL格式用于生成和更改稀疏矩阵。Python不能自动创建稀疏矩阵,所以要用scipy中特殊的命令来得到稀疏矩阵。

(1) 压缩稀疏行(CSR,Compressed Sparse Row):或csr_matrix  按行对矩阵进行压缩的。

CSR使用了三个数组,分别为数值、行偏移(表示某一行的第一个元素在数值里面的起始偏移位置,在行偏移的最后补上矩阵总的元素个数)、列号。CSR是一种编码的方式

一维数组data(数值):有序地存储了所有的非零值,它具有与非零元素同样多数量的元素,通常由变量nnz表示。

一维数组indptr(行偏移量):包含了证书使得indptr[i]是data中元素的索引,它是行i中的第一个非零元素。如果整个行i为零,则indptr[i]==indptr[i+1]

如初始矩阵有m行,则len(indptr)==m+1

一维数组Indices(列号:):其使用如下方式包含列索引信息:indices[indptr[i]:indptr[i+1]]是一个具有行i中非零元素的列索引的整数数组。Len(indice)==len(data)==nnz

备注:列索引表示数值所在的列号,从0开始。

数组data:包含矩阵中的非零元素,以行优先的形式保存。

行偏移:CSR中行索引被压缩,没有行索引,这里用行偏移表示行索引。

实例:

如上图所示:data=(1,7,2,8,5,3,9,6,4)

Indices=(0,1,1,2,0,2,3,1,3)    #列索引

Indptr=(0,2,4,7,9)  #行偏移(表示某一行的第一个元素在数值里面的起始偏移位置,在行偏移的最后补上矩阵总的元素个数)

在Python中使用:

import numpy as np

from scipy.sparse import csr_matrix

indptr = np.array([0, 2, 3, 6])

indices = np.array([0, 2, 2, 0, 1, 2])

data = np.array([1, 2, 3, 4, 5, 6])

A=csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()#生成CSR格式的矩阵

print(A)    #运行结果:

[[1 0 2]

[0 0 3]

[4 5 6]]

解析:第i行的列索引存储在indices[indptr[i]:indptr[i+1]]中,对应的值为data[indptr[i]:indptr[i+1]]。即例如第0行的列索引为indices[0:2]=[0,2](第i行中非零元素的列索引组成的整数数组),值为data[0:2]=[1,2];第1行的列索引为indices[2:3]=[2],值为data[2:3]=[3]…

(2) 稀疏列矩阵CSC(Compressed Sparse Column),用于CSC格式的类型为:csc_matrix按列对矩阵进行压缩的。

与CSR格式相比唯一的不同点是indptr和indices数组的定义,该定义与列有关。

CSC格式的实例:

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.csc_matrix(A)

Print(AS)

print(AS.data)

print(AS.indptr)

print(AS.indices)

print(AS.nnz)    #运行结果:

[1 3 1 2 4]

[0 3 3 4 5]     #注意此处,同一矩阵CSR格式的indptr为[0 2 2 3 5]

[0 2 3 0 3]

5

(3) 基于行的链表格式:LIL(Row-Based Linked List Format)

1. 链表稀疏格式在列表数据中以行方式存储非零元素,

列表data: data[k]是行k中的非零元素的列表。如果该行中的所有元素都为0,则它包含一个空列表。

列表rows: 是在位置k包含了在行k中的非零元素列索引列表。

LIL格式的同一示例:

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.lil_matrix(A)

print(AS.data)

print(AS.rows)

print(AS.nnz)  #运行结果:

[list([1, 2]) list([]) list([3]) list([1, 4])]

[list([0, 2]) list([]) list([0]) list([0, 3])]

5

2. 用LIL格式更改和切割矩阵:

LIL格式最适合切片的方法,即以LIL格式提取子矩阵,并通过插入非零元素来改变稀疏模式。

例如:提取

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.lil_matrix(A)

print(AS)

BS=AS[0:2,0:3]      #切片提取0,1行,0,1,2列组成的子矩阵

print(BS)

print(BS.data)

print(BS.rows)

#运行结果:

(0, 0)        1

(0, 2)        2

[list([1, 2]) list([])]

[list([0, 2]) list([])]

更改:插入新的非零元素会自动更新属性

AS[0,1]=17

print(AS.data)

print(AS.rows)

print(AS.nnz)

#结果:[list([1, 17, 2]) list([]) list([3]) list([1, 4])]

[list([0, 1, 2]) list([]) list([0]) list([0, 3])]

6

生成稀疏矩阵:

Numpy包的命令eye、identity、diag和rand都有其对应的稀疏矩阵,这些命令需要额外的参数来指定所得矩阵的稀疏矩阵格式。

import numpy as np

import scipy.sparse as sp

print(sp.eye(20,20,format = 'lil'))

print(sp.spdiags(np.ones((20,)),0,20,20,format = 'csr'))

print(sp.identity(20,format = 'csc'))

print(sp.rand(20,200,density=0.1,format='csr'))    #sp.rand命令需要额外的参数来描述生成随机矩阵的密度。

稀疏矩阵方法

将稀疏矩阵类型转换为另一种类型和数据或数组的方法:

AS.toarray  #转换稀疏矩阵类型为数组

AS.tocsr

AS.tocsc

AS.tolil

#通过issparse、isspmatrix_lil、isspmatrix_csc、isspmatrix_csr等方法检查稀疏矩阵的类型。

import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

def sparse_sin(A):

if not (sp.isspmatrix_csr(A) or sp.isspmatrix_csc(A)):

A=A.tocsr()

A.data=sin(A.data)

return(A)

B=sparse_sin(A)

print(B)

#稀疏矩阵方法的dot,用于矩阵-矩阵或者矩阵-向量乘法运算,返回csr_matrix或Numpy array

例如:import numpy as np

import scipy.sparse as sp

A=np.array([[1,0,2,0],[0,0,0,0],[3,0,0,0],[1,0,0,4]])

AS=sp.csr_matrix(A)

b=np.array([1,2,3,4])

c=AS.dot(b)     #结果为:[ 7  0 3  17]

print(c)

c=AS.dot(AS)        #结果仍为稀疏矩阵

print(c)

d=np.dot(AS,b)

print(d)     #不能返回期望的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Spring集成进行消息处理

Spring Integration提供了Spring框架的扩展,以支持著名的企业集成模式。 它在基于Spring的应用程序中启用轻量级消息传递,并支持与外部系统的集成。 Spring Integration的最重要目标之一是为构建可维护且可测试的企业集成解决方案提供一个简单的模型。 …

鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品

华为今日官宣,6月2日20:00,将举行鸿蒙操作系统及华为全场景新品发布会。【1、鸿蒙OS2.0】本次发布会的重点将是推出华为今年的重点战略产品——鸿蒙系统。届时鸿蒙OS2.0正式版将陆续推送给手机用户。5月中旬时华为就先行推送了一波鸿蒙OS开发…

C语言结构体字节对齐

默认字节对齐C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不使用宏#pragma…

shell shocked伴奏版_Shell Shocked

【游戏简介】Shell Shocked是一款全新卡牌对战题材的策略类手机游戏。游戏有着丰富的卡牌种类,极具策略性的玩法。游戏中玩家可以将进行真人游戏对战,随机抽取卡牌对战。玩家必须采取适合的策略,才有可能赢取游戏。 游戏操作简单,…

meetup_使用RxNetty访问Meetup的流API

meetup本文将涉及多个主题:响应式编程,HTTP,解析JSON以及与社交API集成。 完全在一个用例中:我们将通过非夸张的RxNetty库实时加载和处理新的metup.com事件,结合Netty框架的强大功能和RxJava库的灵活性。 Meetup提供了…

html约束验证的例子,HTML5利用约束验证API来检查表单的输入数据的代码实例

HTML5对于表单有着极大程度的优化,无论是语义,小部件,还是数据格式的验证。我猜你肯定会以浏览器兼容作为借口不愿意使用这些“新功能”,但这绝不应该成为使你停滞不前的原因,况且还有像Modernizr和ployfill这样的工具…

C语言经典题(1)

输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天#include int mai…

jpg图片使用pil的resize后_如何使用PIL调整图像大小并保持其纵横比?

是否有一种显而易见的方法可以解决这个问题? 我只是想制作缩略图。#1楼PIL已经可以选择裁剪图像img ImageOps.fit(img, size, Image.ANTIALIAS)#2楼我丑陋的例子。函数获取文件如:“pic [0-9a-z]。[extension]”,将它们调整为120x120&#x…

openshift_OpenShift上的Java EE工作流(技术提示#64)

openshift该网络研讨会展示了如何使用WildFly , JBoss Tools , Forge , Arquillian和OpenShift在OpenShift上创建Java EE工作流。 具体来说,它谈论: 如何使用JBoss Developer Studio轻松开发Java EE应用程序并将其直接…

C语言面试-指针和引用的使用场景?

先解决两个疑问◆ 指针和引用的不同之处是什么?◆ 何时用用指针?何时用引用?指针和引用的不同之处看如下代码:指针是用来表示内存地址的,而指针这个整数正是被指向的变量地址。而引用就是给变量重新起了一个名字&#…

排序算法html,排序算法总结.html

排序算法总结 | borens blog排序算法总结borens blog首页所有文章关于作者排序算法总结Apr 6, 2018| 技术人生| 阅读排序,顾名思义,将数据按照某种规则排列起来.这种规则可以是根据基本的数值大小排序,也可以是通过字符串长度比较来排序,又或者是优先根据两个字符串的第一个不…

win10商店下载位置_win10应用商店下载的东西在哪

win10应用商店下载的东西在哪?我们都知道,微软从win8开始,就推出了应用商店,到现在的win10,还是一样。现在的win10应用商店里的东西也越来越丰富了。但是有些win10新用户朋友们在win10应用商店下载了东西,准…

异步http 超时_具有CompletableFuture的异步超时

异步http 超时有一天&#xff0c;我重写了执行不佳的多线程代码&#xff0c;该代码在Future.get()某个时刻被阻塞&#xff1a; public void serve() throws InterruptedException, ExecutionException, TimeoutException {final Future<Response> responseFuture async…

C语言指针变量与一维数组

数组元素之间的地址是相连的&#xff1b;变量地址绝对不是相连的&#xff0c;如果找到规律那也只是一个偶然的&#xff0c;不是必然的&#xff1b;1. 指针变量和一位数组下面对指针数组进行分析&#xff0c;index(小标是从0开始)&#xff0c;array数组是int类型&#xff0c;每一…

天干地支计算公式_高大上:天干地支计算方法

天干地支是我国古代计算年月日的重要依据&#xff0c;作为现代人的我们&#xff0c;有必要去了解一下&#xff0c;他们&#xff0c;以备不时之需。首先介绍一下&#xff0c;天干和地支。共有十天干和十二地支。十天干&#xff1a;甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(…

input发送a.jax_JAX-RS 2.0:服务器端处理管道

input发送a.jax这篇文章的灵感来自JAX-RS 2.0规范文档 &#xff08;附录C&#xff09;中的Processing Pipeline部分。 我喜欢它的原因在于它提供了JAX-RS中所有模块的漂亮快照-以准备好吞咽的胶囊形式&#xff01; 礼貌– JAX-RS 2.0规范文档 因此&#xff0c;我想到了使用此…

html 登录失败,qq音乐登录失败 QQ音乐总是显示登录失败是怎么回事

urlproc.exe是什么进程?没见过&#xff0c;请前辈们指点&#xff1f;造成QQ音乐登录不上现象的原因有如下三种可能&#xff1a; 一、木马病毒对QQ音乐的必要组件或文件进行破坏&#xff0c;导致QQ音乐登录失败&#xff0c;登陆不上的情况发生。 二、Windows系统防火墙(或其他安…

C 常对象成员

C 常对象成员在C 中&#xff0c;可以将对象的成员声明为const&#xff0c;包括常数据成员和常成员函数C 常数据成员 常数据成员的作用与一般常变量相似&#xff0c;用关键字const来声明常数据成员。常数据成员的值是不能改变的&#xff0c;只能通过构造函数的参数初始化表对常数…

python gitlab_Python Gitlab Api 使用方法

简述公司使用gitlab 来托管代码,日常代码merge request 以及其他管理是交给测试&#xff0c;鉴于操作需经常打开网页,重复且繁琐,所以交给Python 管理。安装pip install python-gitlab环境: py3DEMO# -*- coding: utf-8 -*-__Author__ "xiewm"__Date__ 2017/12/26 …

tomee_Apache TomEE + JMS。 从未如此简单。

tomee我记得J2EE &#xff08;1.3和1.4&#xff09;的过去&#xff0c;使用JMS启动项目非常困难。 您需要安装JMS 代理 &#xff0c;创建主题或队列 &#xff0c;最后使用服务器配置文件和JNDI开始自己的战斗。 感谢JavaEE 6及其它&#xff0c;使用JMS确实非常简单。 但是&…