多角度学习python numpy维度(python中多维数组的操作方法)
学习 k-means 算法时被下面算式整懵逼了,对于 np.linalg.norm 搜索下算法含义即可,但是参数 X[:, np.newaxis] - centroids, axis=2 是如何计算的?
np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
本着复杂问题拆分为小问题各个击破思想,我们来学习下 numpy 数组操作。
numpy X[:, np.newaxis] 为数组 增加新维度
操作 | 一维数组效果 | 二维数组效果 |
X[np.newaxis, :] | (1, N) 行向量 | (1, 行, 列) |
X[:, np.newaxis] | (N, 1) 列向量 | (行, 1, 列) |
X[:, :, np.newaxis] | - | (行, 列, 1) |
对于一维数组,我们使用 [5, 6, 7],演示下添加新维度效果
对于二维数组,我们使用[[2, 3, 4], [5, 6, 7]],演示下添加新维度效果
numpy的广播机制
numpy 广播通过自动扩展较小数组的维度,使其与较大数组的形状兼容。规则如下:
- 维度对齐:
从最右维度开始向左逐维度比较形状。
若维度数不同,在较小数组的左侧补1(如形状 (3,) 与 (2,3) 对齐时变为 (1,3) )。
- 维度兼容:
两个数组在某一维度上需满足:大小相等 或 其中一个大小为1(如 (3,1) 与 (3,4) 兼容)。
- 扩展执行:
大小为1的维度会被复制扩展至另一数组的对应维度大小(如 (1,3) 扩展为 (2,3) )。
对于一维数组,我们使用 [5, 6, 7],在新增维度后演示下扩展维度效果
对于二维数组,我们使用[[2, 3, 4], [5, 6, 7]],在新增维度后演示下扩展维度效果
numpy 轴
numpy数组的维度称为轴(axis),从左向右编号:
一维数组: axis=0 (唯一维度)即(axis=0)
二维数组: axis=0 (行)、 axis=1 (列)即(axis=0, axis=1)
三维数组: axis=0 (块/深度)、 axis=1 (行)、 axis=2 即(axis=0, axis=1, axis=3)
二维数组沿各个轴求和,举例说明如下
三维数组沿各个轴求和,举例说明如下
我们假定 X 维度是(300, 2)即300个二维坐标,centroids 维度是(3, 2)即3个二维坐标,来看下下面算式含义
X[:, np.newaxis] - centroids, axis=2
X[:, np.newaxis] 是指维度(300, 2)添加一维度变为(300, 1, 2)。
X[:, np.newaxis] - centroids 通过 numpy 扩展机制,X 维度 (300, 1, 2) 扩展为 (300, 3, 2),centroids 维度 (3, 2) 扩展为 (300, 3, 2),然后两数组相减。
axis=2 表示对三维数组中的列维进行操作。