本章主要介绍scipy库的相关知识。
比如矩阵的压缩(csr_matrix)有两种创建方式,数值积分(integrate定积分),插值等功能。
scipy库可以进行插值,积分,求解微分方程,拟合与优化等。
目录
1. 矩阵压缩成稀疏矩阵csr_matrix
分为两种创建方式:
(1)三个参数为row,col和data三个一维数组;
(2)三个参数为indptr,data和indics三个一维数组;
第一种:
matrix=csr_matrix((data,(row,col)),shape=(3,3))
第二种:
matrix=csr_matrix((data,indices,indptr),shape=(3,3))
第一种示例:
from scipy.sparse import *
row=[0,2,1,0]
col=[0,1,1,2]
data=[4,2,3,6]
array=csr_matrix((data,(row,col)),shape=(3,3))
print(array)
print(array.toarray())
输出:
(0, 0) 4
(0, 2) 6
(1, 1) 3
(2, 1) 2
[[4 0 6]
[0 3 0]
[0 2 0]]
第二种实例:
关于数据解释:
indptr参数:0表示默认起始点,0之后有几个数字就表示有几行数据。每一行的数据个数为后一个减去前一个的差值。第一个数字2表示第一行有2-0=2个数字,即1和2;第二行有3-2=1个数字,即3;第三行有6-3=3个数字,即4,5,6。
indices:表示 各个数据在各行的下标,也就是列的标号, 从该数据我们可以知道:数据1在某行的0位置处, 数据2在某行的2位置处,6在某行的2位置处。 显然,我们从indptr参数能得到行号。
2. 使用interpolate插值
此处使用两种插值方法:线性插值和三次样条插值。
其中新的x轴坐标都是自己设置的均匀个数坐标,y轴是根据函数生成的插值坐标。
import numpy as np
from scipy import interpolate
x=np.linspace(0,10*np.pi,num=20)
y=np.cos(x)
xnew=np.linspace(0,10*np.pi,num=500)
f1=interpolate.interp1d(x,y,kind='slinear') #线性插值
y1=f1(xnew)
# plt.plot(xnew,y1,'g')
ipo3=interpolate.splrep(x,y,k=3) # 三次样条插值
y2=interpolate.splev(xnew,ipo3)
# plt.plot(xnew,y2,'b')
3. 利用integrate计算积分
integrate模块提供了好几种数值积分的方法,包括:
- quad() - 一元定积分
- dblquad() - 二元定积分
- triquad() - 三元定积分
- odeint() - 计算常微分方程组的数值解
传入参数为函数和积分上下限,返回参数为积分结果(即面积)和误差。函数需要写一个def实现。
下面为计算一元积分的例子。
from scipy import integrate
def func(x):
# print("x=",x) #用于展示quad()函数对func的多次调用
return x+1
area,err=integrate.quad(func,0,3)