首页 > 其他分享 >Scipy快速入门

Scipy快速入门

时间:2023-12-28 20:15:39浏览次数:36  
标签:arr 入门 cm csc Scipy matlab print 快速 matrix

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博客

标签:arr,入门,cm,csc,Scipy,matlab,print,快速,matrix
From: https://www.cnblogs.com/NeoNexus/p/17933434.html

相关文章

  • numpy、scipy、pandas、matplotlib的读书报告:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪
    1、基本函数用法Numpy:基础的数学计算模块,来存储和处理大型矩阵,比Python自身的嵌套列表(nestedliststructure)结构要高效的多,本身是由C语言开发。这个是很基础的扩展,其余的扩展都是以此为基础。数据结构为ndarray,一般有三种方式来创建。Scipy:方便、易于使用、专为科学和工程......
  • 【接口自动化测试入门】从0到1落地接口自动化测试
    前段时间写了一系列自动化测试相关的文章,当然更多的是方法和解决问题的思路角度去阐述我的一些观点。这篇文章来聊聊新手如何从零到一落地实践接口自动化测试。为什么要做接口测试测试理念的演变早些时候,软件研发交付流程大多遵循V型或W型的瀑布模式,这种模式下只有开发编码完成......
  • 【eBPF-02】入门:基于 BCC 框架的程序进阶
    本文是eBPF系列的第二篇文章,我们来学习eBPFBCC框架的进阶用法,对上一篇文章中的代码进行升级,动态输出进程运行时的参数情况。主要内容包括:通过kprobe挂载内核事件的eBPF程序要如何编写?通过tracepoint挂载内核事件的eBPF程序要如何编写?eBPF的程序事件类型有哪些......
  • der 入门-精通 09days
    排序排序快速使用(GenericAPIView)1.只有查询所有需要排序2.如何使用1必须是继承GenericAPIView及其子类2在类中配置类属性filter_backends=[OrderingFilter]3类中写属性ordering_fields=['price','id']#必须表的字段4......
  • 【网络安全入门】什么是DOS?DOS攻击类型有哪些?
    大家都知道,DOS攻击是网络安全中比较常见的攻击形式,它的类型和种类有很多,具有很大的危害,而且在网络生活中DOS攻击是不可避免的,那么到底什么是DOS?DOS攻击类型有哪些?虽然DOS攻击不可避免,但掌握攻击类型可以帮助我们有效预防DOS攻击,所以快跟着小编来了解一下吧。什么是DOS?......
  • 【SpringBoot零基础入门到项目实战②】安装Java和Maven,创建你的第一个项目
    文章目录导言安装JavaWindows系统macOS系统Linux系统安装和配置MavenWindows系统macOS系统Linux系统配置Maven本地仓库使用阿里镜像加速创建第一个SpringBoot项目拓展学习(提前了解后面会讲到)1.深入理解SpringBoot的项目结构2.学习SpringBoot的自动配置3.掌握SpringBoot......
  • [C++ 从入门到精通] 17.基类与派生类关系的详细再探讨
    文章预览:一.派生类对象模型简述二.派生类构造函数三.既当父类又当子类(多继承)四.不想当基类的类final五.静态类型与动态类型六.派生类向基类的隐式类型转换七.父类子类之间的拷贝与赋值一.派生类对象模型简述若一个类,继承自一个父类(基类),那么该类称之为子类(派生类)。并且该......
  • [C++ 从入门到精通] 18.左值、右值,左值引用、右值引用、move
    文章预览:一.左值和右值二.引用分类三.左值引用(1个地址符&)四.右值引用(2个地址符&)五.std::move函数一.左值和右值inti;//赋值语句i=20;//左值:i(int类型的对象,代表一块内存区域),右值:20(代表一个值)左值(左值表达式):能用在赋值语句等号左侧的东西,就称之为左值。它能够代表一个......
  • 【零基础入门】凸优化1:怎么培养研究能力,从模型 + 优化开始!
    凸优化1凸优化是什么怎么求最大值、最小值优化问题的形式优化问题类别1:凸函数和非凸函数优化问题类别2:带条件和无条件优化问题类别3:离散和连续优化问题类别4:平滑和非平滑如何判断一个目标函数是凸函数?在同样条件下,怎么设计为凸函数模型?怎么求解非凸函数?怎么对非凸函数松弛......
  • [C++ 从入门到精通] 16.RTTI、dynamic_cast、typeid、虚函数表
    文章预览:一.RTTI是什么二.dynamic_cast类型(指针/引用)转换2.1C风格的强制类型转换2.2指针转换(常见用法)2.3引用转换三.typeid运算符四.type_info类五.RTTI与虚函数表一.RTTI是什么RTTI(Run-TimeTypeIdentification):通过运行时类型信息,程序能够使用基类的指针或引用来检查......