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')

示意图如下:

graph LR;
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]])}

参考文献

.eliminate_zeros()函数-CSDN博客

Scipy快速入门的更多相关文章

  1. numpy快速入门

    numpy快速入门 numpy是python的科学计算的核心库,很多更高层次的库都基于numpy.博主不太喜欢重量级的MATLAB,于是用numpy进行科学计算成为了不二选择. 本文主要参考Scipy ...

  2. 快速入门 Python 数据分析实用指南

    Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一.那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习 ...

  3. python数据可视化神库:Matplotlib快速入门

    Matplotlib易于使用,是Python中了不起的可视化库.它建立在NumPy数组的基础上,旨在与更广泛的SciPy堆栈一起工作,并由几个图组成:线图.条形图.散点图.直方图等. 快速入门 imp ...

  4. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  5. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  6. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  7. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  10. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

随机推荐

  1. ATtiny88初体验(七):TWI

    ATtiny88初体验(七):TWI TWI模块介绍 ATtiny88的TWI模块兼容Phillips I2C以及SMBus,支持主从模式,支持7bit地址,最大允许128个不同的从机地址.在多主机模 ...

  2. OCI云主机环境如何上传下载文件

    OCI云主机的连接是使用密钥而非用户密码连接. 之前使用的非主流的一个SSH工具,正常连接主机都没问题,但需要手工输入用户. 可是在选择SFTP时,始终找不到用户名的设置,导致密钥连接的SFTP始终失 ...

  3. 整理php防注入和XSS攻击通用过滤

    对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlsp ...

  4. Python网络编程——操作系统基础、网络通信原理、.网络通信实现、DNS域名解析、 网络通信流程

    文章目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...

  5. 物理standby database的日常维护【转】

    1.停止Standby select process, status from v$managed_standby; --查看备库是否在应用日志进行恢复 alter database recover ...

  6. 浅谈关于LCA

    prologue 本身只会 tarjan 和 倍增法求LCA 的,但在发现有一种神奇的\(O(1)\) 查询 lca 的方法,时间优化很明显. main body 倍增法 先讨论倍增法,倍增法求 lc ...

  7. MMKV源码解读与理解

    概述 通过 mmap 技术实现的高性能通用 key-value 组件.同时选用 protobuf 协议,进一步压缩数据存储. 标准 protobuf 不提供增量更新的能力,每次写入都必须全量写入.考虑 ...

  8. IIS和PHP相关权限问题及解决方案_500错误_500.19 - Internal Server Error与401未授权错误_401.3 - Unauthorized

    在IIS添加网站(假设站点为xxx.yyy.com,本例假设IIS版本为7.5或以上),如果采用IIS默认配置,会在创建站点同时创建相应同名的"应用程序池"(也是xxx.yyy.c ...

  9. 2022.7.13 tongyf 讲课纪要

    前言 这个笔记记晚了,主要是都在跟 \(LCT\) 进行殊死搏斗,所以博客这方面就挂了很久. tongyf 学长当年是拿到省一之后省选炸了,之后暴切高考.ORZ%%% 这节课讲的是线性dp和背包dp, ...

  10. Verilog语法基础

    FPGA语法 逻辑值: 0:逻辑低电平,条件为假. 1:逻辑高电平,条件为真. z:高阻态,无驱动 x:未知逻辑电平,这既不是0也不是1,只是一个不稳定的状态. 关键字: module:表示模块的开始 ...