Numpy矩阵与通用函数
前言
如果要对数组进行矩阵运算,则可以调用相应的函数。
矩阵和数组是有区别的
- 矩阵中的元素只能是数字,而数组中的元素可以是字符或者字符串
- 矩阵是二维的,数组可以是一维的、多维的
- 矩阵显示时,元素之间无逗号;数组显示时,元素之间用逗号隔开
1 创建矩阵
创建矩阵有如下三个函数:mat、matrix、bmat函数
1.1 使用mat函数创建矩阵
numpy.mat()函数的基本用法相对简单,它接受一个二维数组作为输入,并返回一个矩阵对象。
函数形式:numpy.mat(data, dtype=None)
- data:一个二维数组,可以是列表、另一个矩阵对象或其他可以转换为二维数组的数据结构。
- dtype:可选参数,用于指定矩阵中元素的数据类型。
例子:
import numpy as np
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
print('创建的矩阵为:\n',matr1)
输出:
1.2 使用matrix函数创建矩阵
函数形式:默认为:np.matrix(data, copy = True),而np.mat(data)如果输入数据data本身是矩阵或者多维数组,不会创建data的一个副本,仅仅是创建了一个新的引用。相当于:np.matrix(data,copy=False)
例如:
matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
print('创建的矩阵为:\n',matr2)
输出:
1.3 使用bmat函数创建矩阵
很多时候,会根据小的矩阵创建大的矩阵,即将小矩阵组合成大矩阵。在numpy中,可以使用bmat分块矩阵(block matrix)函数实现。
例如:
arr1 = np.eye(3)
print('创建的数组1为:\n',arr1)
arr2 = 3*arr1
print('创建的数组2为:\n',arr2)
print('创建的矩阵为:\n',np.bmat("arr1 arr2;arr1 arr2"))
2 矩阵运算
2.1 矩阵运算
实现矩阵的加减乘等运算,如下所示:
import numpy as np
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
print('创建的矩阵为:\n',matr1)
matr2 = matr1*3
print('创建的矩阵为:\n',matr2)
输出的matr1和matr2如下:
然后进行运算
两个矩阵相加
print('矩阵相加的结果:\n',matr1+matr2)
输出:
两个矩阵相减
print('矩阵相减的结果:\n',matr1-matr2)
输出:
矩阵相乘
print('矩阵相乘的结果:\n',matr1*matr2)
输出:
矩阵对应元素相乘
print('矩阵对应元素相乘结果为:\n',np.multiply(matr1,matr2))
输出:
2.2 矩阵属性
查看矩阵属性
print('矩阵转置结果为:\n',matr1.T)
输出:
查看共轭转置
print('矩阵共轭转置结果为:\n',matr1.H)
输出:
逆矩阵
print('矩阵的逆矩阵:\n',matr1.I)
??这个应该不存在逆矩阵,不知道为啥会有输出
返回二维数组的试图
print('矩阵的二维数组结果为:\n',matr1.A)
输出:
3 通用函数ufunc
3.1 ufunc函数
ufunc函数是一种能够对数组中所有元素进行操作的函数。
ufunc函数运算有四则运算、比较运算和逻辑运算等,需要注意的是,操作的对象是数组,数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以进行运算的两个数组形状必须相同!
四则运算如下:
相加
x = np.array([1,2,3])
y = np.array([4,5,6])
print('数组相加结果为:',x+y)
输出:
相减,相乘,相除都一样,就不列出来了
数组幂运算
print('数组相加结果为:',x**y)
输出:
ufunc中也可以用完整的比较运算:>、<、==、>=、<=、!=,比较运算返回的结果是一个布尔数组,其每个元素为数组对应元素的比较结果。
例如:
x = np.array([1,3,5])
y = np.array([2,3,4])
print('数组相加结果为:',x<y)
输出:
在numpy逻辑运算中,np.all函数表示逻辑and,np.any表示逻辑or,例如:
print('数组逻辑运算结果为:',np.all(x==y))
输出:
print('数组逻辑运算结果为:',np.any(x==y))
输出:
3.2 ufunc函数的广播机制
广播是指不同形状的数组之间执行算术运算的方式。当两个数组的shape不一致,则numpy会实行广播机制。广播机制的4个原则如下:
- 让所有的输入数组向shape最长的数组看齐,shape中不足的部分通过在前面加1补齐。
- 输出数组的shape是输入数组shape的各个轴上的最大值
- 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1,则这个数组能够用来计算,否则出错。
- 当输入数组的某个轴的长度为1时,沿着此轴运算时使用此轴上的第一组值
具体如下,举个例子:以一维数组和二维数组为例说明广播的运算机制
一维数组
arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
print('创建的数组1为:\n',arr1)
print('数组1的shape为:',arr1.shape)
输出:
arr2 = np.array([1,2,3])
print('创建的数组2为:',arr2)
print('数组2的shape为:',arr2.shape)
输出:
print('数组相加结果:\n',arr1+arr2)
输出:
二维数组
arr1与上述一样,arr2如下:
arr2 = np.array([1,2,3,4]).reshape((4,1))
print('创建的数组2为:\n',arr2)
输出:
print('数组2的shape为:',arr2.shape)
输出:
print('数组相加结果:\n',arr1+arr2)
输出: