目录
方便、易于使用、专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等。
基本可以代替Matlab,但是使用的话和数据处理的关系不大,数学系,或者工程系相对用的多一些。
Scipy特征
(1)内置了图像处理, 优化,统计等等相关问题的子模块
(2)scipy 是Python科学计算环境的核心。 它被设计为利用 numpy 数组进行高效的运行。从这个角度来讲,scipy和numpy是密不可分的。
文件操作io
(1)导包:from scipy import io as spio
(2)保存mat
格式文件
spio.savemat("test.mat", {'a':a})
(3)加载mat
文件
data = spio.loadmat("test.mat")
访问值:data[‘a’]–>相当于map
访问值:data[‘a’]–>相当于map
(4)读取图片文件 导包:from scipy import misc
读取:data = misc.imread("123.png")
[注1]:与matplotlib中plt.imread('fname.png')
类似 [注2]:执行misc.imread
时可能提醒不存在这个模块,那就安装pillow
的包
线性代数操作linalg
(1)求行列式det
res = linalg.det(a)
(2)求逆矩阵inv
res = linalg.inv(a)
若是矩阵不可逆,则会抛异常LinAlgError: singular matrix
(3)奇异值分解svd
u,s,v = linalg.svd(a)
[注1]:s为a的特征值(一维),降序排列, [注2]:a = usv’(需要将s转换一下才能相乘)
t = np.diag(s)
print u.dot(t).dot(v)
梯度下降优化算法
(1)fmin_bfgs
def f(x):
return x**2-2*x
initial_x = 0
optimize.fmin_bfgs(f,initial_x)
[注]:initial_x为初始点(此方法可能会得到局部最小值)
(2)fmin()
、fmin_cg
等等方法
拟合(最小二乘法)
(1)curve_fit
#产生数据
def f(x):
return x**2 + 10*np.sin(x)
xdata = np.linspace(-10, 10, num=20)
ydata = f(xdata)+np.random.randn(xdata.size)
plt.scatter(xdata, ydata, linewidths=3.0,
edgecolors="red")
#plt.show()
#拟合
def f2(x,a,b):
return a*x**2 + b*np.sin(x)
guess = [2,2]
params, params_covariance = optimize.curve_fit(f2, xdata, ydata, guess)
#画出拟合的曲线
x1 = np.linspace(-10,10,256)
y1 = f2(x1,params[0],params[1])
plt.plot(x1,y1)
plt.show()
统计检验
(1)T-检验stats.ttest_ind
a = np.random.normal(0, 1, size=10)
b = np.random.normal(1, 1, size=10)
print stats.ttest_ind(a, b)
输出:(-2.6694785119868358, 0.015631342180817954) 后面的是概率p: 两个过程相同的概率。如果其值接近1,那么两个过程几乎可以确定是相同的,如果其值接近0,那么它们很可能拥有不同的均值。
插值
(1)导入包:from scipy.interpolate import interp1d
#产生一些数据
x = np.linspace(0, 1, 10)
y = np.sin(2 * np.pi * x)
computed_time = np.linspace(0, 1, 50)
#线性插值
linear_interp = interp1d(x, y)
linear_results = linear_interp(computed_time)
#三次方插值
cubic_interp = interp1d(x, y, kind='cubic')
cubic_results = cubic_interp(computed_time)
#作图
plt.plot(x, y, 'o', ms=6, label='y')
plt.plot(computed_time, linear_results, label='linear interp')
plt.plot(computed_time, cubic_results, label='cubic interp')
plt.legend()
plt.show()
求解非线性方程组
(1)optimize
中的fsolve
from scipy.optimize import fsolve
def func(x):
x0,x1,x2 = x.tolist()
return [5*x1-25,5*x0*x0-x1*x2,x2*x0-27]
initial_x = [1,1,1]
result = fsolve(func, initial_x)
print result