科学计算
科学计算是计算机应用的主要内容之一。开源软件Scilab和商业软件MATLAB都是以科学计算为主的应用软件。使用Python同样可以进行矩阵运算、数值分析等。
NumPy和SciPy简介
NumPy和SciPy是Python中用以实现科学计算的模块包。NumPy主要提供了数组对象、基本的数组函数和傅里叶变换的相关函数。SciPy依赖于NumPy,SciPy提供了更多的计算工具,例如绘制图形等。
1、安装NumPy和SciPy
执行下面的命令安装NumPy
pip install numpy
执行下面命令安装SciPy
pip install scipy
2、NumPy的使用简介
NumPy提供了Python没有提供的数组对象。使用NumPy的数组对象可以创建类似于C语言中的数组。使用NumPy时首先应导入NumPy模块。如下实例,在Python交互式命令行中使用NumPy创建数组,并对数组进行简单的运算。
>>> import numpy # 导入NumPy模块
>>> a = numpy.array((1,2,3,4,5)) # 生成一个数组对象
>>> print(a) # 打印数组a
[1 2 3 4 5]
>>> b = numpy.array(([1,2,3],[4,5,6],[7,8,9])) # 生成数组对象b
>>> print(b)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>> c = b + b # 数组对象的加法运算
>>> print(c)
[[ 2 4 6]
[ 8 10 12]
[14 16 18]]
>>> d = c * 2 # 数组对象的乘法运算
>>> print(d)
[[ 4 8 12]
[16 20 24]
[28 32 36]]
>>> e = d / c # 数组对象的除法运算
>>> print(e)
[[2 2 2]
[2 2 2]
[2 2 2]]
>>> print(b * e) # 数组相乘
[[ 2 4 6]
[ 8 10 12]
[14 16 18]]
>>> numpy.sin(b) # 求正弦
array([[ 0.84147098, 0.90929743, 0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 ],
[ 0.6569866 , 0.98935825, 0.41211849]])
>>> numpy.tan(b) # 求正切
array([[ 1.55740772, -2.18503986, -0.14254654],
[ 1.15782128, -3.38051501, -0.29100619],
[ 0.87144798, -6.79971146, -0.45231566]])
>>> numpy.resize(b, [2,2]) # 重新调整b的大小,生成新的数组
array([[1, 2],
[3, 4]])
>>> numpy.resize(b, [3,4]) # 重新调整b的大小
array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 1, 2, 3]])
>>> numpy.sum(b) # 求b中所有元素的和
45
>>> zero = numpy.zeros((4,4)) # 生成一个4*4的全为0的数组
>>> print(zero)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
>>> one = numpy.ones((4,4)) # 生成一个4*4的全为1的数组
>>> print(one)
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
3、SciPy的使用简介
SciPy模块依赖于NumPy,但是SciPy提供了更多的数学工具。使用SciPy不仅可以进行矩阵运算,还可以求解线性方程、进行微积分运算、优化等。SciPy的功能非常接近MATLAB,如下实例,在Python交互式命令行中使用SciPy。
>>> import scipy # 导入scipy模块
>>> a = scipy.mat('[1 2 3; 4 5 6; 7 8 9]') # 生成一个矩阵
>>> print(a)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>> a
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a * 2 # 矩阵乘以2
matrix([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
>>> 0.5 * a # 0.5乘以矩阵a
matrix([[ 0.5, 1. , 1.5],
[ 2. , 2.5, 3. ],
[ 3.5, 4. , 4.5]])
>>> b = scipy.mat('[1;2;3]') # 生成矩阵
>>> print(b) # 输出矩阵
[[1]
[2]
[3]]
>>> b
matrix([[1],
[2],
[3]])
>>> a * b # 矩阵相乘
matrix([[14],
[32],
[50]])
>>> scipy.sin(a) # 求正弦
matrix([[ 0.84147098, 0.90929743, 0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 ],
[ 0.6569866 , 0.98935825, 0.41211849]])
>>> scipy.tan(a) # 求正切
matrix([[ 1.55740772, -2.18503986, -0.14254654],
[ 1.15782128, -3.38051501, -0.29100619],
[ 0.87144798, -6.79971146, -0.45231566]])
>>> scipy.resize(a, (4,4)) # 重新调整举证大小 4*4
array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 1, 2, 3],
[4, 5, 6, 7]])
>>> v = scipy.vander((1,6)) # 生成Vandermonde矩阵
>>> print(v)
[[1 1]
[6 1]]
>>> v
array([[1, 1],
[6, 1]])
>>> scipy.diff(v) # 差分运算
array([[ 0],
[-5]])
>>>
>>> from scipy import integrate # 导入integrate模块
>>> integrate.quad(lambda x: 2*x, 0, 6) # 求积分
(36.0, 3.9968028886505635e-13)
>>> integrate.quad(lambda x: 1/(1 + x ** 2), 0, 1) # 求积分
(0.7853981633974484, 8.719671245021581e-15)