前言
NumPy 是 Python 科学计算的核心库,提供高性能多维数组对象,数据分析、机器学习底层都大量依赖 NumPy。本文完整记录 NumPy 常用操作:数组索引选取修改、数组合并、数组切割、算术运算、深浅拷贝、随机模块、统计函数、矩阵运算、文件读写。
导入固定写法:
import numpy as np
一、多维数组元素的选取与修改
1. 三维数组创建
import numpy as np
创建 0‑47,形状 (2,4,6) 三维数组:2块,每块4行6列
array1 = np.arange(48).reshape(2,4,6)
print(array1)
数组索引格式:数组[块,行,列]
① 选取单个元素
a = array1[1,0,0] # 取第1块,第0行,第0列的单个值
② 选取某一行
b = array1[0,1,:] # 第0块,第1行,全部列
③ 选取某些行
c = array1[0,1:3,:] # 第0块,1~2行(左闭右开),全部列
d = array1[0,[1,3],:] # 第0块,取索引为1、3两行,全部列
④ 选取某一列
e = array1[1,:,1] # 第1块,全部行,第1列
⑤ 选取某些列
f = array1[1,:,1:4] # 第1块,全部行,1‑3列
g = array1[1,:,[1,4]] # 第1块,全部行,索引1、4两列
⑥ 修改数组元素
直接索引赋值即可原地修改数组。
array1[1,0,0] = 100
print(array1)
多层多维示例
v = np.array([array1,array1,array1,array1])
a = v[2,1,2:,1:3]
print(a)
知识点总结:
- : 代表全部;
- start:end 左闭右开切片;
- [索引列表] 花式索引;
- 三维索引顺序:[z轴(块),行,列]。
二、数组的组合(拼接)
1. 生成基础数组
array1 = np.arange(9).reshape(3,3)
array2 = 2*array1
print(array1)
print(array2)
水平组合(左右拼接,增加列)
np.hstack((数组1,数组2))
a3 = np.hstack((array1,array2))
a4 = np.hstack((array2,array1))
a5 = np.hstack((array1,array2,array1))
np.concatenate,axis=1 代表水平(列方向拼接)
a6 = np.concatenate(arrays=[array1,array2], axis=1)
垂直组合(上下拼接,增加行)
np.vstack((数组1,数组2))
a7 = np.vstack((array2,array1))
np.concatenate,axis=0 垂直(行方向拼接)
a8 = np.concatenate(arrays=[array1,array2], axis=0)
print(a8)
重点:
- axis=0:行方向,上下堆叠;
- axis=1:列方向,左右拼接;
- hstack/vstack 和 concatenate 效果等价,concatenate 更通用,支持更高维数组。
三、数组的切割(分割)
hsplit 水平切 (按列),vsplit 垂直切 (按行),这两个只能等分切割;array_split 可以不等分强制切割。
import numpy as np
array1 = np.arange(16).reshape(4,4)
print(array1)
1. 水平切割(按列分割)
# hsplit,等分2份
a = np.hsplit(array1, indices_or_sections=2)
# split + axis=1 等价 hsplit
b = np.split(array1, indices_or_sections=2, axis=1)
2. 垂直切割(按行分割)
# vsplit,等分2份
c = np.vsplit(array1, indices_or_sections=2)
# split + axis=0 等价 vsplit
d = np.split(array1, indices_or_sections=2, axis=0)
3. array_split 强制切割(支持不等分)
# 水平强制切3份,列方向
e = np.array_split(array1, indices_or_sections=3, axis=1)
# 垂直强制切3份,行方向
f = np.array_split(array1, indices_or_sections=3, axis=0)
5 行 5 列数组演示不等分切割
array1 = np.arange(25).reshape(5,5)
print(array1)
g = np.array_split(array1, indices_or_sections=3, axis=1)
h = np.array_split(array1, indices_or_sections=3, axis=0)
总结:
- hsplit / vsplit / np.split:必须能够等分,否则报错;
- np.array_split:允许不等分,剩余元素分到前面数组。
四、数组算术运算
NumPy 数组运算符是对应位置元素运算,不是矩阵乘法。要求两个数组 shape 完全一致。
import numpy as np
array1 = np.arange(1,5).reshape(2,2)
array2 = 2*array1
print(array1)
print(array2)
加法,对应位置相加
print(array1 + array2)
减法
print(array1 – array2)
乘法(元素相乘,不是矩阵点乘)
print(array1 * array2)
除法
print(array1 / array2)
取余 %
print(array1 % array2)
取整除 //
print(array1 // array2)
⚠️ 注意:* 是元素逐个相乘;矩阵真正点乘用 np.dot()。
五、数组浅拷贝与深拷贝
浅拷贝(直接赋值,共用同一块内存)
array1 = np.array([1,2,3])
array2 = array1 # 浅拷贝,别名,指向同一个数组
array2[0] = 100
print(array2)
print(array1) # array1的值也被修改!因为两者是同一个对象
深拷贝 .copy(),完全新内存,互不干扰
array3 = array1.copy()
array3[0] = 10
print(array3)
print(array1) # array1不会变化
重点记忆:
- arr2 = arr1:浅拷贝,共用内存,改一个全部变;
- arr2 = arr1.copy():深拷贝,全新数组,互不影响。
六、NumPy 随机模块
1. randint:生成随机整数
np.random.randint(low, high, size=?),区间 [low,high) 左闭右开。
import numpy as np
设置随机种子,固定随机结果,便于复现
np.random.seed(1000)
r1 = np.random.randint(low=0, high=10)
print(r1)
循环生成 100 个随机数,配合 matplotlib 画直方图:
import matplotlib.pyplot as plt
a = []
for i in range(100):
a0 = np.random.randint(low=0, high=10)
a.append(a0)
plt.hist(a, color='r')
plt.show()
2. rand:0~1 之间浮点数
r1 = np.random.rand()
# 生成5行5列0‑1浮点数矩阵
r4 = np.random.rand(5,5)
print(r4)
3. normal 正态分布
np.random.normal(loc均值, scale标准差, size形状),默认 N(0,1) 标准正态分布。
r2 = np.random.normal()
# loc=5均值,scale=10标准差,5*5数组
r5 = np.random.normal(loc=5, scale=10, size=(5,5))
print(r5)
4. 指定形状随机整数矩阵
r3 = np.random.randint(0, 10, size=(5,5))
print(r3)
np.random.seed(数字):只对后面一次随机生效,固定种子之后每次运行随机数不变。
七、NumPy 统计函数
import numpy as np
array1 = np.random.normal(size=(3,3))
print(array1)
方差
print(array1.var())
标准差
a = array1.std()
均值
b = array1.mean()
求和
c = array1.sum()
中位数
d = np.median(array1)
axis=1 按行求和
e = array1.sum(axis=1)
axis=0 按列求和
f = array1.sum(axis=0)
| .mean() | 均值 |
| .sum() | 求和 |
| .var() | 方差 |
| .std() | 标准差 |
| np.median() | 中位数 |
- axis=0:沿着列方向运算(每一列算一个结果)
- axis=1:沿着行方向运算(每一行算一个结果)
八、矩阵运算
import numpy as np
a = np.arange(4).reshape(2,2)
b = a.copy()
1. * 元素相乘,不是矩阵乘法
print(a*b)
2. 矩阵点乘(真正矩阵乘法)两种写法
a1 = a.dot(b)
a2 = np.dot(a,b)
3. 矩阵求逆 np.linalg.inv()
a3 = np.linalg.inv(a)
原矩阵 × 逆矩阵 ≈ 单位矩阵
a4 = a.dot(a3)
print(a4)
注意:不是所有矩阵都有逆矩阵,奇异矩阵会报错。
九、文件读写
1. 读取 txt 文本 np.loadtxt()
import numpy as np
delimiter 指定分隔符,比如制表符'\\t'、逗号','
data = np.loadtxt(fname='datingTestSet2.txt', delimiter='\\t')
print(data)
2. 保存数组到 txt np.savetxt()
array = np.array([[1,2,3],[4,5,6],[7,8,9]])
np.savetxt(fname="array.txt", array=array)
- loadtxt:读取外部文本数据集,做数据分析经常用来读实验数据;
- savetxt:把 NumPy 数组保存成本地文本文件。
十、全文知识点速查表
- 索引切片:多维数组[块,行,列];:全部;start:end左闭右开;列表花式索引;直接索引赋值修改。
- 拼接:上下拼:vstack / concatenate(axis=0);左右拼:hstack / concatenate(axis=1)。
- 分割:hsplit/vsplit只能等分;array_split支持不等分切割。
- 算数运算:+‑*/%//全部对应位置元素运算;矩阵乘法用np.dot()。
- 拷贝:直接赋值 = 浅拷贝共用内存;.copy()深拷贝独立内存。
- 随机:randint、rand、normal 等函数生成随机数,seed 固定随机种子。
- 统计:mean、sum、var、std、median,支持 axis 参数。
- 矩阵运算:元素乘用 *,矩阵乘用 dot 或 np.dot,求逆用 np.linalg.inv。
- 文件读写:np.loadtxt 读取文本,np.savetxt 保存数组。

