学习目的
通过使用numpy库实现基础的矩阵操作
官方文档
万金油语句
-
help()
查看某个函数的帮助信息print(help(np.array))
蒟蒻的提醒
在这篇博客之中不纠结对于axis的参数设定的具体含义,一律如表所示
代码 | 含义 |
---|---|
axis=1 | 对于每行进行操作 |
axis=0 | 对于每列进行操作 |
创建一个矩阵
- 手动创建
注意:一个维度对应一个中括号!
- 一维矩阵
a = np.array([0, 1, 2, 3, 4])
- 多维矩阵
a = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28 ,29, 30], [31, 32, 33, 34, 35]])
- 一维矩阵
- 自动创建
-
arange()
a = np.arange(5) #>>>0 1 2 3 4 b = np.arang(0,100,10) #>>> 0 10 20 30 40 50 60 70 80 90
· 若只填一个数字n,会生成 [0,n) 的一个一维矩阵
· 或者可以(起始数字,结束数字,步长),回传每一步的首位置 -
random.random()
a = np.random.random() # 生成一个数字 b = np.random.random((2,3) ) #生成一个2行3列的矩阵
· 什么都不填写回传[-1,1]
· 可以传数组大小生成相对应的大小 -
linspace()
print(np.linspace(1,3,3) ) print(np.linspace(0,3,4) )
· (起始值,结束值,分几段)生成等差数列(包括结束值)
-
zeros()
生成全部是0的矩阵(可以用于初始化矩阵),默认调用float32,可以使用 dtype = np.int32 来变换a = zeros((3,4), dtype = np.int32) #生成3*4的矩阵并且为int32型
-
ones()
与ones一样,生成全部是1的矩阵a = ones((3,4), dtype = np.int32)
-
访问矩阵
-
按秩访问
记住从零开始的原则,对于访问单个元素d = a[5,2] # 取a的5,2元素
-
切片访问
1.基本切片:注意:想好了哪个是x轴,哪个是y轴,z轴k轴的再切
d = a[:,6] e = a[2:4, :] f = a[5:6,7:9,:]
2.花式切片
连用判断的方法切片c = a[a >= 50] #只会保存a大于50的
-
通过数组访问
传入一个bool或者int数组访问
1.一维矩阵equal_ten = a==10 print(a[equal_ten]) #只输出10 c = [3,5,106] print(a[c]) #把a的第3,5,106输出
2.高维矩阵
注意有些情况会降维度,看代码matrix = numpy.array([ [ 5, 10, 15], [20, 25, 30], [35, 40, 45], ]) second_column_eq25 = (matrix[:,1] == 25) #只看一列是不是》》出现降维 print (matrix[second_column_eq25 ,:1]) #输出的时候要对应
矩阵性质
注意:性质没有括号,本质是调用内部变量;函数需要加()
-
shape
输出矩阵的长宽高的信息print(a.shape)
拓展:
a.shape = (6,3)
通过属性强制修改a矩阵的大小
-
dtype
返回矩阵的容器类型注意: 矩阵的全部容器完全一样,并且会找最通用的解决(双浮点,string类)
print(a.dtype)
-
size
返回元素总数print(a.size)
-
ndim
返回维度print(a.ndim)
-
T
返回横纵坐标交换的矩阵print(a.T)
矩阵符号操作
-
判断
回传跟矩阵一样大的bool矩阵 -
加法
1.矩阵加矩阵:对应项加对应项
2.矩阵加数字:全部都加这个数字 -
减法
类似加法,不再赘述 -
乘法
使用符号的时候是对应项乘对应项 -
or、and、xor
对应项和对应项经行运算
矩阵数学函数
-
min()和max()
获得最大值print(a.min()) print(a.max())
-
sum()
获得所有元素之和,或者传入axis的参数(1对应每行,0对应每列)print(a.sum()) print(a.sum(axis=0)) print(a.sum(axis=1))
-
cumsum()
获得累积到某个位置的值a = np.arange(10) print(a.cumsum()) # >>>[ 0 1 3 6 10 15 21 28 36 45]
也可以传入axis参数
-
基础数学部分
https://blog.csdn.net/brucewong0516/article/details/79186176
-
floor()和cell()
一个向下取整一个向上取整 -
np.dot()
-
np.dot()
矩阵点乘法!所以相乘的两个矩阵必须是 xy 和 yx
若a dot* b,那么对于结果矩阵(x,y)的值代表a的第x行的所有值分别乘以b的第y列的所有值的和,即:
横坐标A的行,纵坐标B的列a = np.array([ [1,1], [0,1] ]) b = np.array([ [2,0], [3,4] ]) print(a*b) print(np.dot(a,b))
其他函数
-
astype()
强制改变类型vector = vector.astype(float)
-
reshape():
传进去大小参数,调整array的大小,请注意,大小参数的元素数量必须等于之前array的数量a = np.arange(30).reshape(3,5,2) print(a)
-
ravel()
返回高维矩阵的一维形式,全部展开a.ravel()
-
copy()
复制的时候必须使用这个语句复制!!!!b = a.copy() # b此时是新建了一个内存空间存的与a一样大小的值
-
sort()
排序,可以传入axis参数b = a.sort() b = a.sort(axis=1)
-
argsort()
把从小到大的标号列出来b = a.argsort() b = a.argsort(axis=1)
-
argmax()
查找最大值的下标 -
hstack(),vstack(),hsplit(), vsplit()
对于h开头的,表示变化水平
对于v开头的,表示变化高度
-
where()
没有完全掌握,不多说!