还记得自己刚接触Pandas、Sklearn、Tensorflow这几个技术的时候,经常看到文档和代码中针对多维数组的创建、变形、乘法等操作,因为不了解这些知识导致难以理解进度缓慢,后来才知道它们都是在依赖Numpy这个库。
后来我发现,如果想学好Pandas和Sklearn/Tensorflow这些数据分析、机器学习/深度学习的技术,Numpy是一定要系统性的学习的。
本文总结下Numpy的一些重要的知识内容:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SOiJTZwYTOmZWZhNTYwITYhBTNiZWYjFWOxUTNjlDZz8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Numpy的介绍
Numpy是什么
Python的一个开源的数值计算扩展库,用来存储和处理多维矩阵
Numpy的用途
高性能的实现二维或多维数组的处理和计算
作为pandas、scikit-learn、tensorflow等基础依赖库
Numpy的基础结构
一维数组、二维数组
Numpy的核心数据结构
数组的属性
数组的维度:shape元组
数组的维度数目:ndim
数组全部元素的个数:size
数组的元素类型:dtype
构造数组
从Python的列表List和嵌套列表创建array:x = np.array([1,2,3,4,5,6,7,8])
便捷函数:arange、ones/ones_like、zeros/zeros_like、empty/empty_like、full/full_like
随机数组
0~1之间均匀分布:rand(d0, d1, …, dn)
均值0方差1的标准分布:randn(d0, d1, …, dn)
随机整数:randint(low[, high, size)
0~1之间随机数:random([size])
从数组a中随机抽取结果:choice(a[, size, replace, p])
对数组x随机打散:shuffle(x)
实现数组全排列:permutation(x)
按均值loc方差scale生成的高斯分布数组:normal([loc, scale, size])
生成low和high之间均匀分布的数字:uniform([low, high, size])
结构化数组
用于表达各列类型不同的异构数据:np.dtype([('name', 'U10'), ('age', 'i4'), ('weight', 'f8')])
可以用列表切片的方式查询行:my_arr[0:2]
用字典的方式查询列:my_arr['age']
按条件做筛选:my_arr[my_arr["age"] >= 29]
对异构数据的操作一般用pandas更容易处理
数组的操作
数据查询
基础索引:X[:2, 2:4]
神奇索引:x[[3,4,7]]
布尔索引:x[x>5]
怎样增加一个维度
arr[np.newaxis, :]
np.expand_dims(arr, axis=0)
np.reshape(arr, (1, 5))
数组的合并
沿着指定axis进行数组的合并:np.concatenate(array_list, axis=0/1)
垂直vertically、按行row wise进行数据合并:np.vstack或者np.row_stack(array_list)
水平horizontally、按列column wise进行数据合并:np.hstack或者np.column_stack(array_list)
数组的乘法
*符号或者np.multiply:逐元素乘法,对应位置的元素相乘,要求shape相同
@符号或者np.matmul:矩阵乘法,形状要求满足(n,k),(k,m)->(n,m)
数组的排序
numpy.sort:返回排序后数组的拷贝
array.sort:原地排序数组而不是返回拷贝
numpy.argsort:间接排序,返回的是排序后的数字索引
数据统计
np.sum:所有元素的和
np.prod:所有元素的乘积
np.cumsum:元素的累积加和
np.cumprod:元素的累积乘积
np.min:最小值
np.max:最大值
np.percentile:0-100百分位数
np.quantile:0-1分位数
np.median:中位数
np.average:加权平均,参数可以指定weights
np.mean:平均值
np.std:标准差
np.var:方差
广播的概念
规则1:如果两个数组的维度数dim不相同,那么小维度数组的形状将会在左边补1
规则2:如果shape的维度不匹配,但是有维度是1,那么可以扩展维度是1的维度匹配另一个数组;
规则3:如果shape的维度不匹配,但是没有任何一个维度是1,则匹配失败引发错误;
Numpy数组读写到文件
np.load(filename):从.npy或者.npz文件中加载numpy数组
np.save(filename, arr):将单个numpy数组保存到.npy文件中
np.savez(filename, arra=arra, arrb=arrb):将多个numpy数组保存到.npz未压缩的文件格式中
np.savez_compressed(filename, arra=arra, arrb=arrb):将多个numpy数组保存到.npz压缩的文件格式中
线性代数包
求解逆矩阵
B = np.linalg.inv(A)
SVD矩阵分解
U, S, V = np.linalg.svd(A, full_matrices=False)
求解线性方程组
x = np.linalg.solve(A, b)
多项式拟合
params = np.polyfit(x, y, 10)
与其它库的关系
Numpy与Matplotlib的关系
曲线图:plt.plot(x, y)
柱状图:plt.bar(labels, arr)
饼图:plt.pie(arr, labels=labels, autopct='%1.1f%%')
直方图:plt.hist(arr, bins=100, density=1)
Numpy与Pandas的关系
构造Series:series = pd.Series(arr)
构造DataFrame:df = pd.DataFrame(arr, columns = ["ca", "cb", "cc", "cd"])
Series转Numpy:series.values、series.to_numpy()
DataFrame转Numpy:df.values、df.to_numpy()
Numpy与Scikit-learn的关系
数据集是Numpy:data, target = datasets.load_boston(return_X_y=True)
拆分训练集和测试集:X_train, X_test, y_train, y_test = train_test_split(data, target)
训练模型:clf.fit(X_train, y_train)
模型打分:clf.score(X_test, y_test)
模型预估:clf.predict(X_test[:3])
另外,对于Numpy技术的讲解我自己录制成了22集的视频课程:
视频全集地址在爱奇艺搜索“numpy”就能找到我
或者点下方“阅读原文”可以跳转到视频全集