Numpy 库 矩阵数学运算,点积,文件读取和保存等
目录
2.数组(矩阵)的切割
3.数组的数学运算
4.数组的深拷贝和浅拷贝
5.随机模块
6.矩阵统计运算
7.矩阵的特有运算点积,求逆
8.文件读取和保存
1.数组(矩阵)的组合
- 水平组合(
hstack
)和垂直组合(vstack
):hstack
将多个矩阵按列方向拼接(如三行三列 + 三行三列 → 三行六列)。vstack
将多个矩阵按行方向拼接(如三行三列 + 三行三列 → 六行三列)。
-
concatenate
函数,可通过axis
参数指定组合方向(axis=0
为垂直,axis=1
为水平)。import numpy as nparray1=np.arange(9).reshape(3,3)print(array1)[[0 1 2] [3 4 5] [6 7 8]]array2=2*array1print(array2)[[ 0 2 4] [ 6 8 10] [12 14 16]]# 水平组合a3=np.hstack((array1,array2))print(a3)[[ 0 1 2 0 2 4] [ 3 4 5 6 8 10] [ 6 7 8 12 14 16]]a4=np.hstack((array2,array1))print(a4)[[ 0 2 4 0 1 2] [ 6 8 10 3 4 5] [12 14 16 6 7 8]]a5=np.hstack((array1,array2,array1))print(a5)[[ 0 1 2 0 2 4 0 1 2] [ 3 4 5 6 8 10 3 4 5] [ 6 7 8 12 14 16 6 7 8]]a6=np.concatenate((array1,array2),axis=0)#连接print(a6)[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 0 2 4] [ 6 8 10] [12 14 16]]#垂直组合a7=np.vstack((array1,array2))print(a7)[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 0 2 4] [ 6 8 10] [12 14 16]]
2.数组(矩阵)的切割
- 水平切割(
hsplit
)和垂直切割(vsplit
):hsplit(array, 2)
将矩阵水平切分为两部分(如四行四列 → 两个四行两列)。vsplit
按行切分(如四行四列 → 两个两行四列)。
-
split()
函数,通过axis
参数指定切分方向。import numpy as nparray1=np.arange(16).reshape(4,4)print(array1)[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]# 水平切割a=np.hsplit(array1,2)#2表示二等分切割print(a)[array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]b=np.split(array1,2,axis=1)print(b)[array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]# 垂直切割c=np.vsplit(array1,2)print(c)[array([[0, 1, 2, 3], [4, 5, 6, 7]]), array([[ 8, 9, 10, 11], [12, 13, 14, 15]])]d=np.split(array1,2,axis=0)print(d)[array([[0, 1, 2, 3], [4, 5, 6, 7]]), array([[ 8, 9, 10, 11], [12, 13, 14, 15]])]
- 补充:强制切割(
array_split
),当无法均分时按近似规则切分(如五行五列按列切三份 → 2列+2列+1列)。# 强制切割# 水平切割e=np.array_split(array1,3,axis=1)#垂直切割f=np.array_split(array1,3,axis=0)
3.数组的数学运算
import numpy as nparray1=np.arange(1,5,1).reshape(2,2)print(array1)[[1 2] [3 4]]array2=2*array1print(array2)[[2 4] [6 8]]# 数组的加法运算(对应位置的元素求和)print(array1+array2)[[ 3 6] [ 9 12]]# 数组的减法运算(对应位置的元素求差)print(array1-array2)[[-1 -2] [-3 -4]]# 数组的乘法运算(对应位置的元素相乘)print(array1*array2)[[ 2 8] [18 32]]# 数组的除法运算(对应位置的元素相除)print(array1/array2)[[0.5 0.5] [0.5 0.5]]# 数组的取余运算(%)print(array1%array2)[[1 2] [3 4]]# 数组的取整运算print(array1//array2)[[0 0] [0 0]]
4.数组的深拷贝和浅拷贝
浅拷贝(赋值)会导致原数组与拷贝数组同步修改(如 array2 = array1)。
深拷贝(array.copy())独立于原数组,修改不影响原数据。
5.随机模块
使用随机种子(numpy.random.seed)控制随机数生成,仅对 numpy.random 有效。
生成随机数的方法:randint(整数)、rand(0-1小数)、normal(正态分布)。
正态分布参数:均值(loc)控制中心位置,标准差(scale)控制离散程度。
批量生成随机矩阵(如 size=(5,5))。
import numpy as npr1=np.random.rand()print(r1)0.8149436420776961r2=np.random.normal()print(r2)-1.1160570318641674# 生成随机数矩阵r3=np.random.randint(0,10,size=(5,5))print(r3)[[8 9 2 2 6] [4 9 7 9 7] [0 0 9 7 8] [1 4 1 8 0] [2 0 2 2 9]] r4=np.random.rand(5,5)print(r4)[[0.60023193 0.01419595 0.05549209 0.67160039 0.78314385] [0.19544064 0.73777977 0.85955638 0.34585567 0.13006794] [0.36708803 0.16558952 0.44353464 0.06849265 0.86387693] [0.05052874 0.16835242 0.04308036 0.19164382 0.27588562] [0.40844913 0.22696977 0.47796595 0.0091897 0.37547072]]r5=np.random.normal(5,10,size=(5,5))print(r5)[[ 1.0609002 -8.5392921 9.48242322 0.75154795 3.48753174] [ -4.0785129 8.4907759 6.11792809 2.05999932 -1.01203744] [ -9.74659156 5.86627773 -6.91534249 28.65949618 -4.39634281] [ -3.26680732 2.22344898 -0.54337157 -3.92376473 15.58922743] [-15.10813251 -1.25358692 -9.96625947 4.65529048 -7.1070343 ]]
6.矩阵统计运算
基础统计:方差(var)、标准差(std)、均值(mean)、求和(sum)、中位数(median)。
按行/列求和:通过 axis 参数(axis=1 为行,axis=0 为列)。
import numpy as nparray1=np.random.normal(size=(3,3))print(array1)[[-1.84629 -1.50233883 -0.30569565] [-1.01779658 -1.12859979 0.48594668] [ 1.01978122 -1.22772969 -0.22122007]]# 求方差print(array1.var())0.8039318921061643# 求标准差print(array1.std())0.8966224914121685# 求均值print(array1.mean())-0.638215856182889# 求和print(array1.sum())-5.743942705646001# 求中位数print(np.median(array1))-1.0177965755982301# 对矩阵的行求和print(array1.sum(axis=1))[-3.65432448 -1.66044968 -0.42916854]# 对矩阵的列求和print(array1.sum(axis=0))[-1.84430536 -3.85866831 -0.04096904]
7.矩阵的特有运算点积,求逆
- 点乘:
a.dot(b)
或numpy.dot(a, b)
,示例演示了矩阵乘法规则(如形状匹配)。 - 求逆:
numpy.linalg.inv
,验证逆矩阵的正确性(原矩阵与逆矩阵相乘为单位矩阵)。import numpy as npa=np.arange(4).reshape(2,2)[[0 1] [2 3]]b=a.copy()[[0 1] [2 3]]a1=a.dot(b)print(a1)[[ 2 3] [ 6 11]]a2=np.dot(a,b)print(a2)[[ 2 3] [ 6 11]] # 并不是所有矩阵都有逆,即使你没有,也会给你一个伪逆a3=np.linalg.inv(a)print(a3)[[-1.5 0.5] [ 1. 0. ]]
8.文件读取和保存
- 直接读取文本文件为矩阵:
numpy.loadtxt
,支持按分隔符解析数据,对于使用 tab 键分隔的文件,分隔符应设置为 \\t;对于 CSV 文件,分隔符应设置为逗号(,)。 - numpy.save 将矩阵存储为文件,存储的文件可直接打开查看矩阵内容。
- 优势:避免手动转换字符串为数值类型,适合机器学习数据预处理
# import numpy as np# data = np.loadtxt(\'\',delimiter=\'\')#delimiter指定分隔符# 将数组保存到txt文件中import numpy as nparray=np.array([[1,2,3],[4,5,6],[7,8,9]])np.savetxt(\'array.txt\',array)