numpy基础(下)
在本节中,将记录一些numpy的其他操作,如改变矩阵大小、创建01矩阵、创建数字,随机,平均序列、乘法、矩阵基本操作(拉伸成一维、拼接和切割)、最大值查找、矩阵拓展以及排序
首先让我们从引入numpy库开始:
import numpy as np
1.改变矩阵大小
利用reshape([x,y])改变矩阵大小后,可以利用ndim返回矩阵维度
如:
matrix = np.array(np.arange(25)) # 创建一个长度为25的一维矩阵
ch = matrix.reshape([5, 5]) # 改变矩阵大小为5×5
print("原矩阵为:{}".format(matrix))
print("改变后的矩阵为\n{}".format(ch))
print("matrix矩阵维度为:{}".format(matrix.ndim))
print("ch矩阵维度为:{}".format(ch.ndim))
输出结果为:
2.创建0、1矩阵
使用zeros((x,y))和ones((x,y))创建x行y列的全0或全1矩阵
# 创建0矩阵
print("\n~~~~~~~~~~~~~~~~~~创建0矩阵~~~~~~~~~~~~~~~~~~")
print("初始化一个5行5列的0矩阵:\n{}".format(np.zeros((5, 5))))
# 创建全1矩阵
print("\n~~~~~~~~~~~~~~~~~~创建全1矩阵~~~~~~~~~~~~~~~~~~")
print("初始化一个3行3列的创建全1矩阵:\n{}".format(np.ones((3, 3), dtype=np.int32))) # 将数据类型改为int
输出结果为:
3.创建序列
- 创建数字序列
使用方式和python相同,直接使用arrange(x, y, len)表示在区间[x,y]中以步长len取数。
matrix = np.arange(5, 100, 10)
print("从5到100以步长为10创建矩阵:\n{}".format(matrix))
print("reshap成2行5列的矩阵:\n{}".format(matrix.reshape([2, 5])))
输出结果:
2. 创建随机序列
使用numpy自带的ramdom.random((x, y))来生成x行y列的范围为0 ~ 1的矩阵
matrix = np.random.random((3, 4))
print("随机生成3行4列的矩阵:\n{}".format(matrix))
输出结果为:
- 创建平均序列
使用numpy自带的linspace(x, y, len)表示在区间[x,y]中以平均取出len个数。
matrix = np.linspace(0, 2 * np.pi, 100)
print("在0到2 pi中平均取100个数形成的矩阵:\n{}".format(matrix))
输出结果:
4.矩阵乘法
在numpy中,乘法分为矩阵乘法(线性代数中学的行×列)和普通的乘法(对应位置相乘,如矩阵a的第一行第一列只和矩阵b的第一行第一列的数乘)
矩阵乘法使用dot实现,普通乘法直接使用*来实现。
a = np.array([[1, 1], [2, 2]])
b = np.array([[2, 0], [0, 2]])
print("原始矩阵a:\n{}\n原始矩阵b:\n{}".format(a, b))
print("*乘(对应位置相乘):\n{}".format(a * b))
print("矩阵乘法(行乘列):\n{}".format(a.dot(b)))
输出结果:
5.矩阵基本操作
- 多维矩阵变成一维
要将一个多维矩阵,如2维矩阵拉伸成1维,使用ravel即可。
matrix = np.round(10 * np.random.random((3, 4)))
matrix = matrix.astype(np.int32)
print(matrix)
print("多维矩阵变成一维(ravel):\n{}".format(matrix.ravel()))
输出结果为:
2. 矩阵拼接
将两个矩阵拼接可以分为横向拼接hstack((matrix1, matrix2))和纵向拼接vstack((matrix1, matrix2))
a = np.array([[1, 1], [2, 2]])
b = np.array([[2, 0], [0, 2]])
print("原始矩阵a:\n{}\n原始矩阵b:\n{}".format(a, b))
print("横着拼:\n{}".format(np.hstack((a, b))))
print("竖着拼:\n{}".format(np.vstack((a, b))))
输出结果:
- 矩阵切割
既然矩阵可以拼接,那么它也可以被切割。同样被分为横着切hsplit(matrix1, num)和竖着切vhsplit(matrix1, num)
a = np.round(10 * np.random.random((4, 6)))
a = a.astype(np.int32)
print("原始矩阵:\n{}".format(a))
print("横着切:\n{}".format(np.hsplit(a, 3)))
print("竖着切:\n{}".format(np.vsplit(a, 2)))
输出结果为:
6.最大值查找
利用索引查找最大值:
data = np.sin(np.arange(1, 30, 2).reshape(3, 5))
print("原始数据为:\n{}".format(data))
ind = data.argmax(axis=0)
print("按列查找最大值序号为:\n{}".format(ind))
print("找出最大值:\n{}".format(data[ind, range(data.shape[1])]))
输出结果为:
7.矩阵拓展
将一个矩阵按块延申拓展
a = np.arange(0, 100, 20)
print("原始数据为:\n{}".format(a))
print("拓展后:\n{}".format(np.tile(a, (3, 4))))
输出结果为:
8.矩阵排序
a = np.array([[7, 5, 2], [8, 5, 3]])
print("按行排序:\n{}".format(np.sort(a, axis=1)))
a = a.ravel()
print("索引排序:\n{}".format(np.argsort(a)))
print("利用排序后的索引进行排序:\n{}".format(a[np.argsort(a)]))
输出结果为:
代码获取传送门.