当前位置: 首页 > 图灵资讯 > 行业资讯> Python数学建模三剑客之Numpy

Python数学建模三剑客之Numpy

发布时间:2025-04-06 15:48:47

三剑客的Numpy

numpy是一个开源的python科学计算库,包含许多实用的数学函数,包括线性代数、傅里叶变换和随机数生成。最初的numpy实际上是scipy的一部分,后来从scipy中分离出来。

numpy不是python的标准库,需要单独安装。假设python包管理工具pip已经安装在您的运行环境中,numpy的安装非常简单:

pipinstallnumpy

一、数组对象

ndarray是一个多维数组对象,也是numpy的核心对象。在numpy中,数组的维度(dimensions)叫做轴(axes),轴的数字叫秩(rank)。通常,一个numpy数组的所有元素都是相同类型的数据,而这些数据的存储与数组的形式无关。

在下面的例子中,创建了一个三维数组(通常在导入numpy时简写为np)。

importnumpyasnp
a=np.array([1,2,3],[4,5,6],[7,8,9]]

1、数据类型

numpy支持的主要数据类型是布尔型(bool)、整型(integrate)、浮点型(float)和复数型(complex),根据占用内存的字节数,每种数据类型分为多种子类型。常见的数据类型见下表。

2、创建数组

通常,我们使用np.array()创建数组。如果只创建一维数组,也可以使用np.arange()或np.linspace()方法。np.zeros()、np.ones()、np.eye()可构建特殊数据。np.random.randint()和np.random.random()可构建随机数组。

>>>np.array[1,2,3],[4,5,6]#默认元素类型为int3222
array([1,2,3],
[4,5,6])
>>>np.array([1,2,3],[4,5,6],dtype=np.int8#指定元素类型为int8
array([1,2,3],
[4,5,6],dtype=int8)
>>>np.arange(5)#默认元素类型为int32
array(0,1,2,3,4])
>>>np.arange(3,8,dtype=np.int8#指定元素类型为int8
array(3、4、5、6、7),dtype=int8)
>>>np.arange(12).reshape(3)4)#改变shape
array([0,1,2,3],
[4,5,6,7],
[8、9、10、11]])
>>>np.linspace(1,2,5)#从1到2生成5个浮点
array(1.25,1.5,1.75,1.752.])
>>>np.zeros(2,3)#全0数组
array([[0.,0.,0..],
[0.,0.,0.]])
>>>np.ones(2,3)#全1数组
array([1.,1..],
[1.,1.,1.]])
>>>np.eye(3)#主对角线元素1其他元素0
array([1.,0.,0.],
[0.,1.,0.],
[0.,0.,1.]])
>>>np.random.random((2,3)#生成[0,1)之间的随机浮点数
array([0.8473148,0.822318,0.8579278]
[0.5937158,0.9230741,0.04518351]
>>>np.random.randint(0,10,(3,2)#生成[0,10)之间的随机整数
array([2,4],
[8,3],
[8,5]])

3、复杂数组的结构

在许多情况下,我们需要从简单的数据结构中构建复杂的数组。例如,使用一维数据生成二维格点。

(1)重复数组:tile

>>>a=np.arange(5)
>>>a
array(0,1,2,3,4))
>>>np.tile(a,2)
array(0、1、2、3、4、0、1、2、3、4)
>>>np.tile(a,(3,2))
array([0,1,2,3,4,4,0,1,2,3,4],
[0,1,2,3,4,0,1,2,3,4]
[0,1,2,3,4,0,1,2,3,4]

(2)重复元素:repeat

>>>a=np.arange(5)
>>>a
array(0,1,2,3,4)
>>>a.repeat(2)
array(0、0、1、1、2、3、4)

(3)一维数组网格化:meshgrid

>>>a=np.arange(5)
>>>b=np.arange(5,10)
>>>np.meshgrid(a,b)
[array([0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],array([5,5,5,5,5,5],
[6,6,6,6,6],
[7,7,7,7,7,7],
[8,8,8,8,8,8,8
[9,9,9,9]]]]
>>>

(4)指定范围和分割方法的网格化:mgrid

>>>np.mgrid[0:1:2j,1:2:3j]
array([[0.0..],
[1.,1.,1.]],
[1.,1.5,2.],
[1.,1.5,2.]]])
>>>np.mgrid[0:1:0.3,1:2:0.4]
array([[0.0..],
[0.3,0.3,0.3],
[0.6,0.6,0.6],
[0.9,0.9,0.9],
[1.,1.4,1.8]
[1.,1.4,1.8],
[1.,1.4,1.8],
[1.4,1.8]]

虚数用于上述示例。构造虚数的方法如下:

>>>complex(2,5)
(2+5j)

4、数组的属性

除了一些传统属性外,numpy的数组对象还有几个类似于转移和扁平迭代器的属性,看起来更像是方法。扁平迭代器可能是一种简单的多维数组方法,下面的代码给出了一个例子。

>>>a=np.array([1,2,3],[4,5,6]])
>>>a.dtype#数组元素数据类型
dtype('int32')
>>>a.dtype.itemsize#数组元素占据的内存字节数
4
>>>a.itemsize#数组元素占据的内存字节数
4
>>>a.shape#数组的维度
(2,3)
>>>a.size#数组元素的数量
6
>>>a.T#类似于transpose()的数组行变列
array([1,4],
[2,5],
[3,6]])
>>>a.flat#返回多维数组的平面迭代器
<numpy.flatiterobjectat0x0378>
>>>foritemina.flat:
printitem

5、改变数组维度

numpy数组的存储顺序与数组的维度无关,因此改变数组的维度非常方便。除了resize(),这种操作不会改变数组本身的存储顺序。

>>>a=np.array([1,2,3],[4,5,6]])
>>>a.shape#检查数组维度
(2,3)
>>>a.reshape(3,2)#返回3行2列的数组
array([1,2],
[3,4],
[5,6]])
>>>a.ravel()#返回一维数组
array(1、2、3、4、5、6)
>>>a.transpose()#行变列(类似于矩阵转移)
array([1,4],
[2,5],
[3,6]])
>>>a.resize(3,2)#类似于reshape,但会改变操作的数组
>>>a
array([1,2],
[3,4],
[5,6]])

6、索引和切片

numpy和python的list一样,对于一维数组的索引和切片,甚至更加灵活。

a=np.arange(9)
>>>a[-1]#最后一个元素
8
>>>a[2:5]#返回第2到第5个元素
array(2,3,4)
>>>a[:7:3]#返回第0至第7个元素,步长为3
array(0,3,6)
>>>a[::-1]#返回逆序的数组
array([8、7、6、5、4、3、2、1、0]

假设有一栋两层楼,每层的房间是三排四排的,那么我们可以用一个三维数组来保存每个房间的居住人数(当然也可以是房间面积等其他数值信息)。

>>>a=np.arange(24).reshape(2,3,4)#2层3排4排
>>>a
array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15],
[16、17、18、19],
[20,21,22,23]]]
>>>a[1][2][3]#
23
>>>a[1,2,3]#但这是标准用法
23
>>>a[:,0,0]#所有楼层的第一排和第一排
array([0,12])
>>>a[0,:,:]#一楼所有房间等价为a[0]或a[0,...]
array([0,1,2,3],
[4,5,6,7],
[8、9、10、11]])
>>>a[:,:,1:3]#所有楼层的所有排名第2至4列
array([[[1,2],
[5,6],
[9,10]],
[[13,14],
[17,18],
[21,22]]]
>>>a[1,:,-1]#2层每排最后一个房间
array(15、19、23)

7、数组合并

除了下面介绍的水平合并、垂直合并和深度合并外,还有行合并、列合并和concatenate()。如果你比我懒,只知道前三种方法就够了。

>>>a=np.arange(9).reshape(3,3)
>>>b=np.arange(9,18).reshape(3,3)
>>>a
array([0,1,2],
[3,4,5],
[6,7,8]])
>>>b
array([9,10,11],
[12,13,14],
[15,16,17]]
>>>np.hstack((a,b))#水平合并
array([0,1,2,9,10,11],
[3,4,5,12,13,14],
[6、7、8、15、16、17]])
>>>np.vstack((a,b))#垂直合并
array([0,1,2],
[3,4,5],
[6,7,8],
[9,10,11],
[12,13,14],
[15,16,17]]
>>>np.dstack((a,b))#深度合并
array([[[0,9],
[1,10],
[2,11]],
[[3,12],
[4,13],
[5,14]],
[[6,15],
[7,16],
[8,17]]])

8、数组拆分

拆分是合并的逆过程,概念是一样的,但有点不同:

>>>a=np.arange(9).reshape(3,3)
>>>np.hsplit(a,3)#水平拆分,返回list
[array([[0],
[3],
[6]]),array([[1],
[4],
[7]]),array([[2],
[5],
[8]])]
>>>np.vsplit(a,3)#垂直拆分,返回列表
[array([0,1,2]),array([3,4,5]),array([[6,7,8]])]
>>>a=np.arange(27).reshape(3,3,3)
>>>np.dsplit(a,3)#深度拆分,返回list
[array([[[[0],
[3],
[6]],
[[9],
[12],
[15]],
[[18],
[21],
[24]],array([[[[1],
[4],
[7]],
[[10],
[13],
[16]],
[[19],
[22],
[25]]]))),,,,,array([[[[2],
[5],
[8]],
[[11],
[14],
[17]],
[[20],
[23],
[26]]]]]]]]]

9、数组运算

数组和常数的四个操作是数组的每个元素和常数的操作;数组和数组的四个操作是两个数组对应元素的操作(两个数组有相同的shape,否则抛出异常)。

>>>a=np.arange(4,dtype=np.float32).reshape(2,2)
>>>b=np.arange(4,8,dtype=np.float32).reshape(2,2)
>>>a+2#数组和常数可以四次运算
array([[2.,3.],
[4.,5.]],dtype=float32)
>>>a/b#数组和数组可以进行四个运算
array([0.,0.2],
[0.33333334,0.42857143]],dtype=float32)
>>>a==b#最神奇的是,数组可以判断相应的元素是否相等
array([[False,False],
[False,False]],dtype=bool)
>>>(a==b).all()#判断数组是否相等
False

特别提示:如果您想对数组中符合特定条件的元素进行特殊处理,以下代码可能有用。

>>>a=np.arange(6).reshape((2,3))
>>>a
array([0,1,2],
[3,4,5])
>>>(a>2)&(a<=4)
array([[False,False,False],
[True,True,False]],dtype=bool)
>>>a[(a>2)&(a<=4)]
array([3,4])
>>>a[(a>2)&((a<=4))]+=10
>>>a
array([0,1,2],
[13,14,5])

10、数组方法和常用函数

数组对象本身提供了计算平均值、最小值等内置方法,numpy还提供了许多实用的函数。为了缩短空间,以下代码仅以一维数组为例,显示这些方法和函数用法。事实上,在大多数情况下,这些方法和函数对多维数组也同样有效,只有少数例外,如compress函数。

>>>a=np.array(3,2,4)
>>>a.sum()#所有元素的和
9
>>>a.prod()#乘积所有元素
24
>>>a.mean()#所有元素的算数平均值
3.0
>>>a.max()#所有元素的值
4
>>>a.min()#所有元素的最小值
2
>>>a.clip(3、4)#小于3的元素被3取代,大于4的元素被4取代
array([3,3,4])
>>>a.compress(a>2)#返回由大于2的元素组成的数组
array([3,4])
>>>a.tolist()#返回pythonlistt
[3,2,4]
>>>a.var()#计算方差(元素与平均值的平均值)
0.66666666666666663
>>>a.std()#计算标准差(方差算术平方根)
0.81649658092772603
>>>a.ptp()#返回数组值与最小值之间的差异
2
>>>a.argmin()#在扁平数组中返回最小值的索引
1
>>>a.argmax()#在扁平数组中返回值的索引
2
>>>np.where(a==2)#返回所有值为2的元素的索引
(array([1]),)
>>>np.diff(a)#回到相邻元素的差异
array([-1,2])
>>>np.log(a)#返回对数组
array(1.0986129,0.69314718,1.38629436)
>>>np.exp(a)#返回指数数组
array(7.3890561,54.59815003](20.08553692)
>>>np.sqrt(a)#返回开方数组
array(1.73205081,1.41421356,2.])
>>>np.msort(a)#数组排序
array(2,3,4)
>>>a=np.array(1,4,7)
>>>b=np.array(8,5,2)
>>>np.maximum(a,b)#返回多个数组中对应位置元素的值数组
array(8,5,7)
>>>np.minimum(a,b)#在多个数组中返回对应位置元素的最小值
array([1,4,2])
>>>np.true_pide(a,b)#实现数学除法运算的真实数学除法
array(0.125、0.8、3.5)

二、矩阵对象

matrix是继承ndaray类型的矩阵对象,因此它包含ndaray的所有数据属性和方法。然而,当您将矩阵对象作为数组操作时,应注意以下几点:

matrix对象总是二维的,即使是展平(ravel函数)操作或成员选择,返回值也是二维的

混合matrix对象和ndaray对象的运算总是返回matrix对象

1、创建矩阵

Matrix对象可以用Matlab风格的字符串创建(用空格分隔列,用分号分隔行的字符串),或者用数组创建。

>>>np.mat('147;258;369')
matrix([1,4,7],
[2,5,8],
[3,6,9]])
>>>np.mat(np.arange(1,10).reshape(3,3))
matrix([1,2,3],
[4,5,6],
[7,8,9]]]

2、矩阵的独特属性

矩阵有几个独特的属性,使计算更容易。这些属性包括:

>>>m=np.mat(np.arange(1,10).reshape(3,3))
>>>m
matrix([1,2,3],
[4,5,6],
[7,8,9]])
>>>m.T#回到自己的转移
matrix([1,4,7],
[2,5,8],
[3,6,9]])
>>>m.H#回到自己的共轭转移
matrix([1,4,7],
[2,5,8],
[3,6,9]])
>>>m.I#返回自己的逆矩阵
matrix([[-4.5035963e+15,9.0071925e+15,-4.5035963e+15],
[9.0071925e+15,-1.80143985e+16,9.00719925e+15],
[-4.5035963e+15,9.0071925e+15,-4.5035963e+15]
>>>m.A#返回自己数据的二维数组的视图
array([1,2,3],
[4,5,6],
[7,8,9]])

3、矩阵乘法

对于ndarray对象来说,星号是按元素乘以的,dot()函数被视为矩阵相乘。对于matrix对象,星号和dot()函数都是矩阵相乘。特别是对于一维数组,dot()函数实现向量点乘(结果是标量),但星号实现的不是差乘。

>>>a=np.array(1,2,3)
>>>b=np.array(4,5,6)
>>>a*b#元素相乘的一维数组
array(4,10,18)
>>>np.dot(a,b)#元素相乘的一维数组再求和
32
>>>a=np.array([1,2],[3,4])
>>>b=np.array([5,6],[7,8]])
>>>a*b#多维数组,元素相乘
array([5,12],
[21,32]])
>>>np.dot(a,b)#实现矩阵相乘的多维数组
array([19,22],
[43,50]])
>>>m=np.mat(a)
>>>n=np.mat(b)
>>>np.dot(m,n)#矩阵相乘
matrix([19,22],
[43,50]])
>>>m*n#矩阵相乘
matrix([19,22],
[43,50]])

三、线性代数模块

numpy.linalg 是numpy的线性代数模块,可用于解决逆矩阵、特征值、线性方程组和行列式等问题。

1、计算逆矩阵

虽然matrix对象本身具有逆矩阵属性,但使用numpy.Linalg模块求解矩阵的逆转也很简单。

m=np.mat('012;103;4-38')
mi=np.linalg.inv(m)#mi是m的逆矩阵。如何证明?
m*mi#矩阵乘以其逆矩阵,结果是单位矩阵
matrix([1.,0.,0.],
[0.,1.,0.],
[0.,0.,1.]])

2、计算行列式

我不记得如何计算行列式了,但我仍然记得手工计算行列式的痛苦。现在,你可以很容易地在手机上使用numpy(前提是你的手机上安装了python) + numpy)。

m=np.mat('012;103;4-38')
np.linalg.det(m)#什么?这就成了?
2.0

3、计算特征值和特征向量

m=np.mat('012;103;4-38')
>>>np.linalg.eigvals(m)#计算特征值
array(7.96850246,0.4848592,0.5169846)
>>>np.linalg.eig(m)#元组返回特征值及其对应特征向量
(array(7.96850246,0.4848592,0.5169846),matrix([0.2695165,0.9072191,0.743492],
[0.36874217,0.2431631,0.6548206],
[0.8899042,0.34192476,0.13509171])

4、解决线性方程组

有线性方程组如下:

x-2y+z=0
2y-8z=8
-4x+5y+9z=

求解过程如下:

>>>A=np.mat('1-21;02-8;-459')
>>>b=np.array(0,8,-9)
>>>np.linalg.solve(A,b)
array(29.,16..])#x=29,y=16,z=3

python学习网,大量免费python视频教程,欢迎在线学习!

相关推荐:

1、Matplotlibib,Python数学建模三剑客

2、Scipyython数学建模三剑客

相关文章

python3兼容python2吗

python3兼容python2吗

2025-05-09
python3 whl怎么安装

python3 whl怎么安装

2025-05-09
python 字典怎么提取value

python 字典怎么提取value

2025-05-09
python 怎样计算字符串的长度

python 怎样计算字符串的长度

2025-05-09
python 怎么样反向输出字符串

python 怎么样反向输出字符串

2025-05-09
python 怎么判断字符串开头

python 怎么判断字符串开头

2025-05-09