python numpy 中的广播操作

发布时间 2023-09-15 09:28:41作者: yspm

这辈子也学不会 numpy。

Python中的广播(broadcasting)是一种用于在不同形状的数组之间执行二进制操作的机制,使得它们的形状可以兼容,并且能够按照一定的规则进行元素级操作。这个机制允许你在不显式复制数据的情况下,对形状不同的数组进行操作,这可以节省内存和提高代码的效率。

广播的原理基于以下规则:

  • 如果两个数组的维度不同,将维度较小的数组进行扩展,使得它的维度与较大的数组相匹配。扩展时会在维度较小的数组的前面(左侧)添加新的维度,这些维度的大小为1。

  • 如果两个数组的维度相同,但某些维度的大小不同,将大小为1的维度扩展为匹配较大数组的大小。

  • 如果在某个维度上两个数组的大小都不相等且不为1,那么广播将无法执行,会引发错误。

广播的目的是使得两个数组在进行元素级操作时具有兼容的形状,这样可以将相应的元素一一对应起来进行操作,而不需要显式复制数据。

np.newaxis 可以帮助你在特定位置添加大小为 \(1\) 的维度。

如果要给一个训练集一个测试集求 \(L_2\) 距离,不允许使用任何 for loop。它的写法是 dists=np.sqrt(np.sum((X[:,np.newaxis]-X_train)**2,axis=2))

原理就是先把原来大小为 \([N,picture\_size]\) 的图片添加维度变成 \([N,1,picture\_size]\) 。这下子来发广播,广播的时候大小为 \([M,picture\_size]\) 的 X_train 首先在左边添加一维,大小变成 \([1,M,picture_size]\)

接下来根据广播的原理 \([N,1],[1,M]\) 统一变成 \([N,M]\),然后就可以对位操作了。完全无法深入理解如何广播,都说广播比 for loop 快,我不会广播只能写出来不能利用并行计算的废物代码了。