深度学习|NumPy 图解入门( 二 )

, 然后按元素位置相加 , 直接输入 data + ones 即可:

同理 , 不只是加法 , 减、乘、除都是没有问题 , 甚至可以像下面 data * 1.6 一样直接很方便的统一运算:

广播机制这里引入了 NumPy 的 广播机制 , 上面的例子中 , 标量 1.6 被拉伸为张量 [12
的相同尺寸(2)的向量 。 标量被拉伸以后的张量尺寸与待运算值完全适配 , 传递到空缺位进行计算 。 这个规则在某些地方被称为 “低维有1” , 即 数组维度相同 , 其中有个轴为1。
但其实个人觉得没有必要这么去理解!
我们可以简单的解释为:广播主要发生在两种情况 , 一种是两个数组的维数不相等 , 但是它们的后缘维度的轴长相符 , 另外一种是有一方的长度为1 。 再简化一点 , 两个数组在任意轴上长度或维度(或长度+维度)相等 , 则可以触发广播 。
后面的部分我们再去详细分析 。
索引与聚合NumPy 的索引应该说非常灵活了 , 直接上图 , 非常清晰:

常见的聚合操作 summinmax 可以从下图看到运算方式:

当然 , NumPy 还支持以下聚合操作:

1
2
3
45
np.prod(big_array)   # 求数组中所有元素的乘积
np.mean(big_array)   # 求数组中所有元素的平均值
np.median(big_array) # 求数组中所有元素的中位数
np.var(big_array)    # 求数组中所有元素的方差
np.std(big_array)    # 求数组中所有元素的标准差
矩阵之前一直是从一维数组的角度来初步理解 NumPy 的使用方式 , 但实际上从二维数组(矩阵)开始 , 才算是真正有 NumPy 的用武之地 。
创建矩阵我们可以使用 np.array([[12
[34

)
的方式来创建一个矩阵 , 也可以使用上个部分提到的 ones()zeros()random.random() 方法来创建:

矩阵运算如果矩阵尺寸完全一致 , 那么用算数运算符 加减乘除 来处理自然是不在话下 。
但是如果对不同大小的矩阵执行的话 , 就需要 广播机制 了 , 比如下面的例子:

这里我们正好可以再深入理解 广播机制。 这里的 ones_row 是二维数组 , 但是每个维度只有1个元素 , 那么我们可以理解为:dataones_row 两个数组在维度上相等 , 可以触发广播 。
点乘虽然在这里提点乘方法 dot(), 但是不代表他必须由矩阵使用 。 在直接上例子说明更好理解:

细心观察 , 图里特意标红了 3, 因为该图的作者在强调两个矩阵的临近边必须有相同数量的维度 。
简单解析一下点乘的规则 。 如果我们计算 np.dot(A B) , A为二维m*n的矩阵 , B必须为n*l的矩阵 , 也就是说A有多少列 , B就必须有多少行 , 否则无法运算 。 下面的图可以简单说明原理:

也就是说 , 可以把开始的那个点乘例子理解为:

矩阵索引与聚合矩阵的索引使得我们对数据的操作更加得心应手:

至于聚合 , 除了之前一维数组提到的基本操作外 , 我们还可以给出 axis 参数来指定行间、列间的聚合 。 例如:

矩阵旋转与重塑又是两个超实用的方法 。 首先是旋转矩阵 , 例如需要对两个矩阵执行点乘运算并对齐它们共享的维度时 , 我们就可以用方法 T 来执行:

在某些情况下 , 我们得到的数据(例如问卷采集、爬虫等)并不符合计算模型的要求 , 这是我们就可以用