python中numpy广播功能(broadcasting)的一些注意事项

系统 1785 0

Python 的特性允许你使用广播( broadcasting )功能,这是 Python numpy 程序语言库中最灵活的地方。而我认为这是程序语言的优点,也是缺点。优点的原因在于它们创造出语言的表达性, Python 语言巨大的灵活性使得你仅仅通过一行代码就能做很多事情。但是这也是缺点,由于广播巨大的灵活性,有时候你对于广播的特点以及广播的工作原理这些细节不熟悉的话,你可能会产生很细微或者看起来很奇怪的 bug 。例如,如果你将一个列向量添加到一个行向量中,你会以为它报出维度不匹配或类型错误之类的错误,但是实际上你会得到一个行向量和列向量的求和。

Python 的这些奇怪的影响之中,其实是有一个内在的逻辑关系的。但是如果对 Python 不熟悉的话,我就曾经见过的一些学生非常生硬、非常艰难地去寻找 bug 。所以我在这里想做的就是分享给你们一些技巧,这些技巧对我非常有用,它们能消除或者简化我的代码中所有看起来很奇怪的 bug 。同时我也希望通过这些技巧,你也能更容易地写没有 bug Python numpy 代码。

为了演示 Python-numpy 的一个容易被忽略的效果,特别是怎样在 Python-numpy 中构造向量,让我来做一个快速示范。首先设置,这样会生成存储在数组  中的5个高斯随机数变量。之后输出 ,从屏幕上可以得知,此时  的 shape (形状)是一个的结构。这在 Python 中被称作 一个一维数组 。它既不是一个行向量也不是一个列向量,这也导致它有一些不是很直观的效果。举个例子,如果我输出一个转置阵,最终结果它会和看起来一样,所以和的转置阵最终结果看起来一样。而如果我输出和的转置阵的内积,你可能会想:乘以的转置返回给你的可能会是一个矩阵。但是如果我这样做,你只会得到一个数。

python中numpy广播功能(broadcasting)的一些注意事项_第1张图片

所以我建议当你编写神经网络时,不要在它的 shape 是还是或者一维数组时使用数据结构。相反,如果你设置  为,那么这就将置于5行1列向量中。在先前的操作里  和  的转置看起来一样,而现在这样的  变成一个新的  的转置,并且它是一个行向量。请注意一个细微的差别,在这种数据结构中,当我们输出  的转置时有两对方括号,而之前只有一对方括号,所以这就是1行5列的矩阵和一维数组的差别。

python中numpy广播功能(broadcasting)的一些注意事项_第2张图片

如果你输出  和  的转置的乘积,然后会返回给你一个向量的外积,是吧?所以这两个向量的外积返回给你的是一个矩阵。

python中numpy广播功能(broadcasting)的一些注意事项_第3张图片

就我们刚才看到的,再进一步说明。首先我们刚刚运行的命令是这个 ,而且它生成了一个数据结构 ,是,一个有趣的东西。这被称作  的一维数组,同时这也是一个非常有趣的数据结构。它不像行向量和列向量那样表现的很一致,这也让它的一些影响不那么明显。所以我建议,当你在编程练习或者在执行逻辑回归和神经网络时,你不需要使用这些一维数组。

python中numpy广播功能(broadcasting)的一些注意事项_第4张图片

相反,如果你每次创建一个数组,你都得让它成为一个列向量,产生一个向量或者你让它成为一个行向量,那么你的向量的行为可能会更容易被理解。所以在这种情况下,等同于。这种表现很像 ,但是实际上却是一个列向量。同时这也是为什么当它是一个列向量的时候,你能认为这是矩阵;同时这里 将要变成,这就像行向量一样。所以当你需要一个向量时,我会说用这个或那个( column vector or row vector ),但绝不会是一维数组。

我写代码时还有一件经常做的事,那就是如果我不完全确定一个向量的维度( dimension ),我经常会扔进一个断言语句( assertion statement )。像这样,去确保在这种情况下是一个向量,或者说是一个列向量。这些断言语句实际上是要去执行的,并且它们也会有助于为你的代码提供信息。所以不论你要做什么,不要犹豫直接插入断言语句。如果你不小心以一维数组来执行,你也能够重新改变数组维数 ,表明一个数组或者一个数组,以致于它表现更像列向量或行向量。

我有时候看见学生因为一维数组不直观的影响,难以定位bug而告终。通过在原先的代码里清除一维数组,我的代码变得更加简洁。而且实际上就我在代码中表现的事情而言,我从来不使用一维数组。因此,要去简化你的代码,而且不要使用一维数组。总是使用  维矩阵(基本上是列向量),或者  维矩阵(基本上是行向量),这样你可以减少很多 assert 语句来节省核矩阵和数组的维数的时间。另外,为了确保你的矩阵或向量所需要的维数时,不要羞于  reshape  操作。

总之,我希望这些建议能帮助你解决一个 Python 中的bug,从而使你更容易地完成练习。

 

 

了解更多?

微信公众号:freeinvest


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论