前言
学 Python 做数据分析、机器学习,绕不开 NumPy。
Python 自带的列表做大批量数值运算效率很低,NumPy 底层是 C 写的,专门用来处理多维矩阵数据,Pandas、Matplotlib、很多机器学习库底层都依赖它。
很多同学刚上手会被一堆函数搞晕,我把日常最常用的操作整理成笔记,全部都是实际敲过的代码,跟着跑一遍就能理解。
安装如果还没装:
pip install numpy所有代码第一行基本都是导入,行业惯例简写为 np。
import numpy as np1. 创建 ndarray 数组
ndarray 就是 numpy 里面的数组对象,可以理解成增强版列表,支持一维、二维、三维甚至更高维CSDN博...。
1.1 从普通列表转换
list1 = [1,2,3,4,5] # 一维数组 v = np.array(list1) print(v) # 二维数组,多个一维数组嵌套 m = np.array([list1,list1,list1]) print(m) # 三维数组,多个二维数组嵌套 z = np.array([m,m,m]) print(z)1.2 快速生成特殊数组
# 生成全0数组 a = np.zeros((2,3)) # 生成全1数组 b = np.ones((3,3)) # 全部填充指定数字 c = np.full((2,2), 5) # 单位矩阵 d = np.eye(5) print(a,b,c,d)1.3 生成有规律的数据
np.arange(start,end,step):左闭右开,和 range 很像np.linspace(start,end,nums):闭区间,均匀取 n 个点
r1 = np.arange(0,9,3) print(r1) # 0到1,一共21个点 r2 = np.linspace(0,1,21) print(r2)2. 查看数组基础属性
拿到一个陌生数组,先看这几个属性,搞清楚它长什么样:
.shape:数组形状,几行几列.ndim:维度,1 维 / 2 维 / 3 维.size:总元素个数.dtype:元素的数据类型(int、float 等)
arr = np.array([[1,2,3],[4,5,6]]) print(arr.shape) print(arr.ndim) print(arr.size) print(arr.dtype)3. 数组维度变换:升维、降维
reshape () 修改形状
注意:reshape 不会改变原数组,返回新数组;
-1代表让 numpy 自动计算该维度大小。
v = np.array([1,2,3,4,5,6,7,8]) # 一维转二维 r1 = v.reshape(2,4) # -1自动算 r2 = v.reshape(4,-1) print(r1)resize()
和 reshape 不一样,resize 直接修改原始数组,没有返回值
v.resize(4,2) print(v)高维降一维:ravel () 和 flatten ()
两个都可以把多维数组压扁成一维,但有坑,面试经常考:
ravel():尽量返回视图,修改返回的数组,有可能改动原数组,省内存flatten():一定返回副本,修改返回值不会影响原数组,更安全
v = np.array([[1,2],[3,4]]) r1 = v.ravel() r2 = v.flatten() print(r1) print(r2)4. 数组元素选取和修改
索引切片是高频操作,一维、二维、三维写法略有区别。
一维数组
array1 = np.arange(1,9) # 取单个 print(array1[1]) # 花式索引,取多个不连续 print(array1[[1,3,5]]) # 切片,左闭右开 print(array1[0:6]) # 修改 array1[0] = 100 array1[[1,3]] = 20 print(array1)二维数组
逗号隔开,前面是行,后面是列
array1 = np.arange(24).reshape(4,6) # 某一个元素 第二行第五列 print(array1[1,4]) # 取一整行 print(array1[3,:]) # 取一整列 print(array1[:,3]) # 不连续的行 print(array1[[0,2],:]) # 修改 array1[1,4] = 999 print(array1)三维数组
格式:[第几个二维矩阵,行,列]
array1 = np.arange(48).reshape(2,4,6) # 第一个二维数组,第1行全部列 print(array1[0,1,:]) # 第二个二维数组,全部行,第2列 print(array1[1,:,1])5. 数组的拼接与切割
拼接(组合数组)
hstack()水平拼接(左右拼,增加列)等价于concatenate(axis=1)vstack()垂直拼接(上下拼,增加行)等价于concatenate(axis=0)
array1 = np.arange(9).reshape(3,3) array2 = array1 * 2 # 水平,左右放一起 a3 = np.hstack((array1,array2)) # 垂直,上下摞起来 a7 = np.vstack((array1,array2)) # concatenate通用拼接,axis控制方向 a6 = np.concatenate((array1,array2),axis=1) a8 = np.concatenate((array1,array2),axis=0) print(a3) print(a7)切割(拆分数组)
hsplit:水平切(按列切)vsplit:垂直切(按行切)split(arr,份数,axis=)通用切分array_split:可以不均等切割,份数不能整除数组长度的时候不会报错
array1 = np.arange(16).reshape(4,4) # 水平切成2份 a = np.hsplit(array1,2) # 垂直切成2份 c = np.vsplit(array1,2) # 强制分成3份,不能整除也可以运行 e = np.array_split(array1,3,axis=1) print(a)6. 拷贝:赋值、浅拷贝、深拷贝
这个坑非常多人踩,简单说:
- 直接用
=赋值,只是别名,两个变量指向同一块内存,改一个另一个跟着变 .copy()才是真正复制一份独立数组(深拷贝)
array1 = np.array([1,2,3]) # 只是别名,不是复制 array2 = array1 array2[0] = 100 print(array1) # array1也被改变! # copy真正拷贝 array3 = array1.copy() array3[0] = 10 print(array1) # 原始数组不受影响7. 数组算数运算
numpy 数组的加减乘除,默认是对应位置元素逐个运算,不是矩阵乘法!要求两个数组 shape 尽量匹配。
array1 = np.arange(1,5).reshape(2,2) array2 = array1 * 2 print(array1 + array2) print(array1 - array2) print(array1 * array2) # 对应元素相乘,不是矩阵点乘 print(array1 / array2) print(array2 % array1) # 取余注意:⚠️矩阵真正的点乘(线性代数矩阵乘法):使用dot()
a1 = array1.dot(array2) a2 = np.dot(array1,array2) print(a1)矩阵求逆在np.linalg线性代数模块
inv_mat = np.linalg.inv(array1)8. 常用统计函数
可以指定axis:
axis=0:按列计算axis=1:按行计算
arr = np.random.normal(size=(3,3)) print(arr.mean()) # 均值 print(arr.sum()) # 求和 print(arr.std()) # 标准差 print(arr.var()) # 方差 print(np.median(arr)) #中位数 print(arr.sum(axis=0)) #每一列求和 print(arr.sum(axis=1)) #每一行求和9. numpy 随机模块
写模拟、生成测试数据经常用到。
# 设置随机种子,保证每次运行随机结果一样 np.random.seed(100) # 随机整数 [low,high) r1 = np.random.randint(0,10,size=(5,5)) print(r1) # 0~1之间浮点数 r2 = np.random.rand(3,3) print(r2) # 正态分布,loc均值 scale标准差 r3 = np.random.normal(loc=5,scale=2,size=(2,2)) print(r3)10. 文件读写
处理真实数据,经常需要读取 txt 文本。np.loadtxt()读取文本,delimiter指定分隔符,比如制表符\t、逗号,。savetxt把数组保存成文本文件。
# 读取制表符分隔的txt文件 data = np.loadtxt('datingTestSet2.txt', delimiter='\t') print(data) # 保存数组到文件 arr = np.array([[1,2,3],[4,5,6]]) np.savetxt('array.txt',arr)最后
以上就是我练习 numpy 敲的大部分基础代码。
很多初学者一上来就死记一堆函数名,其实不用。记住几个关键点:
- numpy 数组所有元素数据类型统一
- 搞懂 shape、维度、axis(0 列 1 行)
- 分清视图和副本,
ravel和flatten、直接赋值和copy() - 分清元素相乘
*和矩阵点乘dot()
把上面这些练熟,再去学 pandas、机器学习预处理就顺畅很多。
如果对你有帮助,欢迎点赞收藏,后续会更新 pandas 学习笔记。
补充小提示
遇到报错优先检查:数组 shape 是否匹配、axis 有没有搞反、切片是不是越界、有没有忘记 copy 导致原数组被意外修改。