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. [htmlayout] picture标签替代img, 解决更新图片数据后依然显示原图片数据

    在hl中, 你可能遇到过这样的情况.   给img标签设置了一个图片路径.   在软件使用过程中对这个路径的数据进行过重写, 删除等等 但img依然还是显示最初载入的图片数据. 解决办法: 用&quo ...

  2. 【matplotlib基础】--动画

    matplotlib的动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便:二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要. 不过 ...

  3. PPT太大发不出去?教你三个PPT压缩方法,200M的PPT变15M

    相信有很多小伙伴在工作的时候,都会制作不少的PPT,而我们也知道很多PPT在制作完成以后,体积就会变得非常大,在发送给别人的时候总是会受到限制,是有点难搞了. 别担心,今天小编将告诉大家三个简单的方法 ...

  4. [自制工具]简便易用的ADDM报告生成工具

    ■■ Oracle ADDM简介 ADDM全称是Automatic Database Diagnostic Monitor,是Oracle实现性能自我诊断的最佳利器.它依赖于AWR,我们知道AWR会自 ...

  5. 代码的艺术-Writing Code Like a Pianist

    前言 如何评定一个系统的质量?什么样的系统或者软件可以称之为高质量?可以从三个角度来看,一是架构设计,例如技术选型.分布式系统中的数据一致性考虑等,二是项目管理,无论是敏捷开发还是瀑布式开发,都应当对 ...

  6. CF1878 A-G 题解

    前言 赛时代码可能比较难看. 为什么 Div3 会出 4 道数据结构. A 判定 \(a\) 中是否有 \(k\) 即可. 赛时代码 B 奇怪的构造题. 令 \(a_1=1,a_2=3\),其他项由上 ...

  7. 基于jquery+html开发的json格式校验工具

    json简介 JSON是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-2 ...

  8. 请教shell读写XML问题

    请教shell读写XML问题 现有 123.xml文件,内容是:<?xml version="1.0" encoding="GBK"?><vi ...

  9. APP攻防--安卓逆向&JEB动态调试&LSPosed模块&算法提取&Hook技术

    JEB环境配置 安装java环境变量(最好jdk11) 安装adb环境变量 设置adb环境变量最好以Android命名 启动开发者模式 设置-->关于平板电脑-->版本号(单机五次) 开启 ...

  10. GPTs破冰硅基文明社会

    GPTs破冰硅基文明社会 渐进是技术革命的常态 技术革命看似一夕之间就颠覆了世界,但实际上每项重大技术进步的背后,都经历了漫长的渐进积累.以蒸汽机为例,最初动力微弱.效率低下,需要大量工程师跟车维护, ...