矩阵的算术运算,包括矩阵加、减、乘、转置、求逆等。
numpy类库提供了很多矩阵运算的方法,分别解释如下:
1.矩阵元素的索引
对矩阵元素的索引,可以从不同的角度出发加以引用,如矩阵的一行或一列,也可以是某个指定位置的元素。对二维矩阵x来说,如果只用一个下标引用,则指给定的行,例如:
>>>x=np.array([[1,2],[5,6]])
>>>x[0]
视频讲解:python矩阵计算—遍历
array([1,2])
指定具体元素,可在给定行后,再增加一个[]中跟随列索引完成,如:
>>>x[0][1]
2
这种写法和C语言是保持一致的。如果感觉以矩阵理论中矩阵元素的表达更容易理解,则可以写成[i,j]的形式,如:
>>>x[0,1]
2
2.矩阵的行和列数
numpy矩阵是一个对象,要获取一个矩阵的维数,使用其shape属性即可,如:
size=A.shape
size[0]是行数,size[1]是列数。
3.矩阵的加减运算
视频讲解:矩阵计算—算术
矩阵的“+”“-”运算对两个相同尺寸的矩阵进行,运算时直接用“+”“-”运算符进行。
例如:
4.矩阵相乘np.dot
矩阵相乘,符合线性代数的运算规则,在numpy中,又被称为点乘,函数名为dot。
设有矩阵A,B,将其相乘得到矩阵C,使用的语句为:C=np.dot(A,B)。例如:
也可以直接使用矩阵的dot方法,如:
numpy也支持2个矩阵进行“*”运算,但“*”运算与线性代数中的矩阵乘法有很大差异,例如:
我们看到,相乘的结果是,X的每个元素与Y的对应的列相乘。按线性代数理论,上面的运算结果显然不是我们需要的。但由于“*”运算无语法错误,很容易引起误解,所以请牢记:矩阵间相乘不能用“*”号,只能使用dot方法。
5.矩阵转置
矩阵转置,将原矩阵的行变列,列变行。其语句为:
B=np.transpose(A)
或(www.daowen.com)
B=A.T
例如:
6.方阵求逆
矩阵求逆,要求原矩阵是满秩的方阵。设A是满秩方阵,则A的逆矩阵可以用如下的语句求得:
B=np.linalg.inv(A)
例如:
此时,矩阵Dinv是D的逆,将两个矩阵相乘,应该得到一个单位矩阵,将D和Dinv相乘的结果如下:
可见,在误差范围内(10-15可以认为是0),结果矩阵是一个单位矩阵。
7.矩阵与标量运算
矩阵与标量的加、减、乘、除运算,对矩阵的每个元素进行,如:
上述代码先生成一个3×3的单位矩阵,将其与1相加,结果是矩阵的每个元素都增加了1。
视频讲解:python矩阵计算—特殊运算
8.算术运算扩展
称之为运算扩展,是因为这些运算并不符合线性代数、矩阵论等计算的规则,但在实际的科学计算中又需要这样的一些处理方式带来的便利。如一个矩阵与一个向量相除,或相减,在线性代数中并不存在这样的理论,但实际科学计算中却很有必要。设矩阵X是描述n个样本的检测数据,每个样本有m个特征。在进行科学计算时,经常存在将矩阵X按列进行处理,如将每个特征调整为0均值,1方差。其处理过程是将每列减去其均值,然后除以其标准差。这样的处理采用循环对矩阵X的每列进行,还是用一条语句实现?numpy采用了后面的方案。很显然,这种方案使程序的逻辑更加清晰,也符合人类思维的习惯。
numpy支持矩阵与向量的加、减、乘、除运算,其运算规则按矩阵的列开展,即向量的每个元素与矩阵的对应列进行相应的运算。参看下面对矩阵X按列实现数据的0均值,1方差的语句。
avg=X.mean(axis=0)
std=X.std(axis=0)
X=(X-avg)/std
前2条语句实现矩阵按列求得均值和方差。最后一条语句则实现每列减去自己的均值,然后除以对应的方差,语句相当简练。
9.矩阵的常用函数
矩阵对象本身有很多辅助运算的函数,如sum(元素和)、std(标准偏差)等。默认情况下,这些函数对矩阵所有元素进行。但由于矩阵具有行、列属性,因此,通过特别指定,这些函数也可以按行或列进行操作。而指定该操作的参数为axis,当axis=0时,按列操作,axis=1时,按行操作。例如:
视频讲解:python矩阵计算—函数
>>>x=np.array([[1,2,3],[5,6,7]])
>>>x.sum( )
24
>>>x.sum(axis=0)
array([6,8,10])
>>>x.sum(axis=1)
array([6,18])
当选择了参数axis后,函数计算的过程按列或行进行,得到的结果仍然是一个ndarray对象。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。