这是Numpy的第二篇,第一篇可以看此链接
【Numpy第一讲】如何生成矩阵,如何对矩阵进行加减乘除
更改矩阵的维度
使用np.reshape()函数
使用方法:
import numpy as np
矩阵 = np.array([1,2,3,4,5,6,7,8])
# 将它重新形状为2行4列的二维数组
reshape后 = np.reshape(矩阵,(2, 4))
print(reshape后)
r e s h a p e 后 = [ 1 2 3 4 5 6 7 8 ] reshape后=\begin{bmatrix} 1 & 2 & 3 & 4\\ 5&6&7&8 \\ \end{bmatrix} reshape后=[15263748]
用户可以自行设置修改后的行列数值,此时我们将一个一位的数组转换为了二行四列的数组,函数将会自动将他们转换为对应的形状。
但如果无法满足新数组的大小,那么就会报错。
此外,无需将行列两个数都给出,倘若只给出一个,将另外一个填为-1,函数会自动计算另一个参数
import numpy as np
矩阵 = np.array([1,2,3,4,5,6,7,8])
# 将它重新形状为4列的二维数组
reshape后 = np.reshape(矩阵,(4, -1))
print(reshape后)
r e s h a p e 后 = [ 1 2 3 4 5 6 7 8 ] reshape后=\begin{bmatrix} 1 & 2 \\ 3 & 4\\ 5&6 \\ 7&8 \\ \end{bmatrix} reshape后= 13572468
使用np.resize()函数
和上一个函数类似,它也可以转换函数的维度
但是相对于前者有一个最大的不同
np.resize()函数可以忽视匹配度,如果新矩阵的元素数量大于原矩阵,那么就会新增元素以匹配新矩阵
import numpy as np
矩阵 = np.array([1,2,3,4,5,6,7,8])
# 将它重新形状为4行4列的二维数组
resize后 = np.resize(矩阵,(4,4))
print(resize后)
新矩阵中的元素为16个,但原矩阵显然不满足,于是函数将重复原矩阵的元素,直到满足位置
r
e
s
i
z
e
后
=
[
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
]
resize后=\begin{bmatrix} 1 & 2 &3 &4\\ 5 & 6&7&8\\ 1 & 2 &3 &4\\ 5 & 6&7&8\\ \end{bmatrix}
resize后=
1515262637374848
当新矩阵不足以容纳原来的元素时,函数将删除多余的元素。
import numpy as np
矩阵 = np.array([1,2,3,4,5,6,7,8])
# 将它重新形状为4行1列的二维数组
resize后 = np.resize(矩阵,(4,1))
print(resize后)
r e s i z e 后 = [ 1 2 3 4 ] resize后=\begin{bmatrix} 1 \\ 2\\ 3 \\ 4 \\ \end{bmatrix} resize后= 1234
对矩阵进行统计
有时候我们需要求出矩阵中的最大值,平均值,或者是某一列某一行的某个值。
此时就需要求值的函数了,非常简单,对于总矩阵来说,可以用的函数有以下几个
import numpy as np
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 矩阵A中所有元素的和
A.sum()
# 矩阵的A最大值
A.max()
# 矩阵的A最小值
A.min()
# 最大元素所在的位置(从0开始)
A.argmax()
# 最小元素所在的位置(从0开始)
A.argmin()
但此时,你想只针对矩阵中某一行某一列,应该怎么做呢
import numpy as np
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 矩阵A每一行中的最大值
A.max(axis=1)
## 矩阵A每一列中的最大值
A.min(axis=0)
我们用 axis=1 表示横轴(行),用 axis=0 表示纵轴(列),以此单独计算出所有列和行具体的值。
矩阵的切片和索引
矩阵的索引
对于一个矩阵,我们有时候想获取它的一部分,这时候就需要将矩阵切片了
要了解切片,我们首先需要知道索引,和列表这类数据一样
a = np.array([1, 2, 3, 4])
b = a[1]
#b的值为2
a = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
b = a[1][2]
#b的值为7
矩阵的遍历
对于一位矩阵,可以和列表一样遍历
a = np.array([1, 2, 3, 4])
for i in a:
print(i)
会逐个打印1,2,3,4
对于多维的矩阵,有两种遍历方法
第一种:将多维矩阵转换为一维的矩阵
a = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
#使用flat函数将a转换为一维的
b = a.flat
for i in b:
print(i)
第二种:通过索引组成双循环逐行打印
a = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
#此处len(a)计算的是a的行数
for i in range(len(a)):
#此处len(a[0])代表第一行中有多少元素
for j in range(len(a[0])):
print(a[i][j])
矩阵的分片
矩阵的分片是根据索引来进行分片的
对于一维矩阵,通过 : 这个符号,可以选定范围,如果没有后范围,那么就是将前范围一直到最后打印出来
a = np.array([1, 2, 3, 4])
b = a[1:]
此时b的值就是 [2, 3, 4],代表从第二个数字一直到最后
a = np.array([1, 2, 3, 4])
b = a[1:3]
此时b的值就是 [2, 3],代表从第二个数字到第三个数字
它是不包含尾部数字的,也就是说[1:3]其实只能输出“第1号”到“第2号”
如果想要倒序输出,那么就需要在后范围改为**:-1**
a = np.array([1, 2, 3, 4])
b = a[::-1]
#打印b,得到[4, 3, 2, 1]
#也可以选中开始倒序的位置
b = a[1::-1]
#那么结果将从第二个数开始倒序
#b的值为[2, 1]
对于多维矩阵,也是类似的
a = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
b = a[0:2,1:3]
表示打印第一行、第二行中,第二列、第三列。
此时b就是
b
=
[
2
3
6
7
]
b=\begin{bmatrix} 2 &3 \\ 6&7 \\ \end{bmatrix}
b=[2637]
它同样不包含最后一位
当需要打印某一列或者某一行的全部时,只填一个 : 即可
a = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
b = a[0:1,:]
此时b的值就是 [1, 2, 3, 4]