Scipy快速入门
Scipy快速入门

注意事项
图床在国外,配合美区、日区网络使用更佳,如遇图片加载不出来,考虑换个VPN吧。
监修中敬告

本文处于Preview阶段,不对文章内容负任何责任,如有意见探讨欢迎留言。
联系方式——绿泡泡:NeoNexusX
常量
稀疏矩阵 (scipy.sparse)
CSC 压缩稀疏列(csr_matrix()
用于高效的算数,快速列切分。
# csr
csr_arr = np.array([0, 0, 1, 0, 0, 0, 0, 1])
print(f'csc_matrix(csc_arr) is : \n{csc_matrix(csr_arr)}\n')
结果如下:
csc_matrix(csc_arr) is :
(0, 2) 1
(0, 7) 1
CSR 压缩稀疏行(csc_matrix())
用于快速行切分,更快的矩阵向量乘积。
# csc
csc_arr = np.array([[0],
[1],
[0],
[0],
[0],
[0],
])
print(f'csc_matrix(csc_arr) is : \n{csc_matrix(csc_arr)}\n')
结果如下:
csc_matrix(csc_arr) is :
(1, 0) 1
举一个复杂一点的例子:
# 获取对应矩阵
cm_arr = np.array([[1, 0, 6, 0, 7],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[0, 0, 0, 0, 5],
])
print(f'csr_matrix(cm_arr) is : \n{csr_matrix(cm_arr)}\n')
print(f'csc_matrix(cm_arr) is : \n{csc_matrix(cm_arr)}\n')
输出结果:
csr_matrix(cm_arr) is :
(0, 0) 1
(0, 2) 6
(0, 4) 7
(1, 1) 2
(2, 2) 3
(3, 3) 4
(4, 4) 5
csc_matrix(cm_arr) is :
(0, 0) 1
(1, 1) 2
(0, 2) 6
(2, 2) 3
(3, 3) 4
(0, 4) 7
(4, 4) 5
获取非0元素(.data)
代码如下:
# 获取非0元素
print(f'csc_matrix(cm_arr).data is : \n{csc_matrix(cm_arr).data}\n')
print(f'csr_matrix(cm_arr).data is : \n{csr_matrix(cm_arr).data}\n')
输出结果:
csc_matrix(cm_arr).data is :
[1 2 6 3 4 7 5]
csr_matrix(cm_arr).data is :
[1 6 7 2 3 4 5]
获取非0元素个数(.count_nonzero() )
# 获取非0元素个数
print(f'csr_matrix(cm_arr).count_nonzero() is : \n{csr_matrix(cm_arr).count_nonzero()}\n')
print(f'csc_matrix(cm_arr).count_nonzero() is : \n{csc_matrix(cm_arr).count_nonzero()}\n')
输出结果:
csr_matrix(cm_arr).count_nonzero() is :
7
csc_matrix(cm_arr).count_nonzero() is :
7
删除零元素(.eliminate_zeros())
注意这是一个方法,你如果用在已经建立好的矩阵是没有效果的:
举个例子:
# 减少对应矩阵的0数目
c_m = csc_matrix(cm_arr)
c_m.eliminate_zeros()
r_m = csr_matrix(cm_arr)
r_m.eliminate_zeros()
print(f'csc_matrix(cm_arr).eliminate_zeros() is : \n{c_m}\n')
print(f'csr_matrix(cm_arr).eliminate_zeros() is : \n{r_m}\n')
可以看到这里的输出和上文的内容并没有发生什么变化:
csc_matrix(cm_arr).eliminate_zeros() is :
(0, 0) 1
(1, 1) 2
(0, 2) 6
(2, 2) 3
(3, 3) 4
(0, 4) 7
(4, 4) 5
csr_matrix(cm_arr).eliminate_zeros() is :
(0, 0) 1
(0, 2) 6
(0, 4) 7
(1, 1) 2
(2, 2) 3
(3, 3) 4
(4, 4) 5
我们再来举个例子:
row = [0, 0, 0, 1, 1, 1, 2, 2, 2] # 行指标
col = [0, 1, 2, 0, 1, 2, 0, 1, 2] # 列指标
data = [1, 0, 1, 0, 1, 1, 1, 1, 0] # 在行指标列指标下的数字
team = csr_matrix((data, (row, col)), shape=(3, 3))
print(f'team is : \n{team}\n')
print(f'team type is : \n{type(team)}\n')
print(f'team.shape is : \n{team.shape}\n')
team.eliminate_zeros()
print(f'team.eliminate_zeros is : \n{team}\n')
输出结果如下;
team is :
(0, 0) 1
(0, 1) 0
(0, 2) 1
(1, 0) 0
(1, 1) 1
(1, 2) 1
(2, 0) 1
(2, 1) 1
(2, 2) 0
team type is :
<class 'scipy.sparse._csr.csr_matrix'>
team.shape is :
(3, 3)
team.eliminate_zeros is :
(0, 0) 1
(0, 2) 1
(1, 1) 1
(1, 2) 1
(2, 0) 1
(2, 1) 1
可以看到team转化为另一个非稀疏的矩阵类型。
CSC和CSR的转换 (.tocsr() / .tocsc())
这个就很简单了,没什么可说的:
# csr 2 csc
print(f'csr_matrix is : \n{r_m}\n')
print(f'c_m.tocsr() is : \n{c_m.tocsr()}\n')
将对应的CSC转化成CSR:
csr_matrix is :
(0, 0) 1
(0, 2) 6
(0, 4) 7
(1, 1) 2
(2, 2) 3
(3, 3) 4
(4, 4) 5
c_m.tocsr() is :
(0, 0) 1
(0, 2) 6
(0, 4) 7
(1, 1) 2
(2, 2) 3
(3, 3) 4
(4, 4) 5
图 (CSGraph)
使用邻接矩阵来构建一个图如下:
# graph part
# 构建了一个正方形的图
arr = np.array([
[0, 2, 0, 4],
[2, 0, 3, 0],
[0, 3, 0, 4],
[4, 0, 4, 0],
])
graph = csr_matrix(arr)
print(f'graph is : \n{graph}\n')
示意图如下:
A <--2-->B<--3-->C<--4-->D<--4-->A
结果如下:
graph is :
(0, 1) 2
(0, 3) 4
(1, 0) 2
(1, 2) 3
(2, 1) 3
(2, 3) 4
(3, 0) 4
(3, 2) 4
连通性检测 (connected_components())
n_components, labels = connected_components(graph, directed=False, connection='weak', return_labels=True)
print("连通分量数量:", n_components)
print("节点标签:", labels)
连通性输出结果如下:
连通分量数量: 1
节点标签: [0 0 0 0]
由于这里没有设置节点标签,所以输出全是0.
最短路 (Dijkstra()、floyd_warshall() 、bellman_ford() )
三个函数只需要将图输入进去就可以得到对应的到各个节点的最短路径。
# dijkstra
print(f'dijkstra seq is : \n{dijkstra(graph, indices=0)}\n')
# Floyd warshall
print(f'floyd_warshall matrix is : \n{floyd_warshall(graph)}\n')
# bellman ford
print(f'bellman_ford matrix is : \n{bellman_ford(graph, indices=0)}\n')
结果如下:
dijkstra seq is :
[0. 2. 5. 1.]
floyd_warshall matrix is :
[[0. 2. 5. 1.]
[2. 0. 3. 3.]
[5. 3. 0. 4.]
[1. 3. 4. 0.]]
bellman_ford matrix is :
[0. 2. 5. 1.]
广搜与深搜 (depth_first_order(), breadth_first_order())
两个函数的作用都是以某个参数为基点返回对应的顺序和对应节点的前驱序列。
举个例子:
# depth first order
print(f'depth_first_order seq is : \n{depth_first_order(graph, 0)}\n')
# breadth first order
print(f'breadth_first_order seq is : \n{breadth_first_order(graph, 0)}\n')
输出结果:
depth_first_order seq is :
(array([0, 1, 2, 3]), array([-9999, 0, 1, 2]))
breadth_first_order seq is :
(array([0, 1, 3, 2]), array([-9999, 0, 1, 0]))
详见:scipy.sparse.csgraph.depth_first_order — SciPy v1.11.4 Manual
matlab数据读取与导出( io.savemat()、io.loadmat())
# matlab part
# 导出matlab 数据 等等
matlab_output = io.savemat('filename.mat', {'data': arr})
print(f'matlab_output is \n {matlab_output} \n')
# 读取 matlab 数据 等等
matlab_intput = io.loadmat('filename.mat')
print(f'matlab_input is \n{matlab_intput}\n')
matlab_intput_data = matlab_intput['data']
print(f'matlab_input \'s data is \n{matlab_intput_data}\n')
输出结果如下:
返回的是字典包含了很多信息,我们可以通过字典的方式来提取内容。
matlab_output is
None
matlab_input is
{'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Sun Dec 10 21:40:56 2023', '__version__': '1.0', '__globals__': [], 'data': array([[0, 2, 0, 1],
[2, 0, 3, 0],
[0, 3, 0, 4],
[1, 0, 4, 0]])}
matlab_input 's data is
[[0 2 0 1]
[2 0 3 0]
[0 3 0 4]
[1 0 4 0]]
数据的外围又被包上了一个数组,我们可以通过如下方式来实现读取,将其变为1维的:
matlab_intput_without = io.loadmat('filename.mat', squeeze_me=True)
print(f'matlab_intput_without is \n{matlab_intput_without}\n')
matlab_intput_data_without = matlab_intput_without['data']
print(f'matlab_intput_data_without \'s data is \n{matlab_intput_data_without}\n')
输出结果如下:
matlab_intput_without is
{'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Sun Dec 10 21:44:24 2023', '__version__': '1.0', '__globals__': [], 'data': array([[0, 2, 0, 1],
[2, 0, 3, 0],
[0, 3, 0, 4],
[1, 0, 4, 0]])}
参考文献
Scipy快速入门的更多相关文章
- numpy快速入门
numpy快速入门 numpy是python的科学计算的核心库,很多更高层次的库都基于numpy.博主不太喜欢重量级的MATLAB,于是用numpy进行科学计算成为了不二选择. 本文主要参考Scipy ...
- 快速入门 Python 数据分析实用指南
Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一.那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习 ...
- python数据可视化神库:Matplotlib快速入门
Matplotlib易于使用,是Python中了不起的可视化库.它建立在NumPy数组的基础上,旨在与更广泛的SciPy堆栈一起工作,并由几个图组成:线图.条形图.散点图.直方图等. 快速入门 imp ...
- Web Api 入门实战 (快速入门+工具使用+不依赖IIS)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)
今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- Mybatis框架 的快速入门
MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...
- grunt快速入门
快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...
随机推荐
- ionic4请求skynet服务器的资源跨域问题
最近在做一个后台接口, 顺便用ionic4写了个简单的管理后台, 本来skynet管理后台监听的端口是6666, 但是发现chrome默认对一些接口不友善, 虽然可以通过设置启动参数来解决, 但是还是 ...
- Solution -「洛谷 P6287」「COCI 2016-2017」Mag
Description Link. 定义一条链的价值为链上点权乘积除以节链上点数,求一条价值最小的链. Solution 结论:答案链上最多包含一个 \(2\)(其余全为 \(1\)),并且不在链的两 ...
- 基于go语言gin框架的web项目骨架
该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装. 目前该骨架实现了大多数的组件,比如事件,中间件,日志,配置,参数验证,命令行,定时任务等功能,目前可以满足大 ...
- MySQL系列之主从复制基础——企业高可用性标准、主从复制简介、主从复制前提(搭建主从的过程)、主从复制搭建、主从复制的原理、主从故障监控\分析\处理、主从延时监控及原因
文章目录 0.企业高可用性标准 *** 0.1 全年无故障率(非计划内故障停机) 0.2 高可用架构方案 1. 主从复制简介 ** 2. 主从复制前提(搭建主从的过程) *** 3. 主从复制搭建(C ...
- 深入理解 Skywalking Agent
概述 Agent 功能介绍 + 整体结构 + 设计 插件机制详解 Trace Segment Span 详解 异步 Trace 详解 如何正确地编写插件并防止内存泄漏 扩展:如何基于 Skywalki ...
- Mac OS安装Python的pip
最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。) 原因为他的python没有numpy这个库(这个故事很典).然鹅雪上加霜的是,他的电脑是Mac,没有Windows ...
- OpenTiny Vue 支持 Vue2.7 啦!
你好,我是 Kagol. 前言 上个月发布了一篇 Vue2 升级 Vue3 的文章. 少年,该升级 Vue3 了! 里面提到使用了 ElementUI 的 Vue2 项目,可以通过 TinyVue 和 ...
- Unity - Win平台修改窗口标题
原文参考 主要是通过user32.dll获取窗口句柄, 和Unity没有什么关系 using System; using System.Diagnostics; using System.Runtim ...
- Mybatis-plus 生成代码
引入依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-g ...
- Net 高级调试之七:线程操作相关命令介绍
一.简介 今天是<Net 高级调试>的第六篇文章.上一篇文章我们说了值类型,引用类型,数组等的内存表现形式.有了这个基础,我们可以更好的了解我们的程序在运行时的状态,内存里有什么东西,它们 ...