2.16 关于 Python Numpy 的说明-深度学习-Stanford吴恩达教授

文章讨论了PythonNumpy中一维数组的特性,强调了广播功能在灵活性与潜在问题间的平衡。作者建议在编程时避免使用秩为1的数组,而应明确指定行或列向量结构,以减少因广播特性引发的bug。推荐使用reshape和assert语句来确保代码的清晰和正确性。
摘要由CSDN通过智能技术生成

关于 Python Numpy 的说明 (A Note on Python/Numpy Vectors)

本节主要讲Python中的numpy一维数组的特性,以及与行向量或列向量的区别。并介绍了老师在实际应用中的一些小技巧,去避免在coding中由于这些特性而导致的bug

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

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

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

所以我建议当你编写神经网络时,不要使用这种数据结构,而是令 a 的形状为(5,1),这会是使a成为一个5x1的列向量。如下图操作:

 此时再进行转置,就得到一个行向量:

 请注意一个细微的差别,在这种数据结构中,当我们打印a的转置结果中有两个方括号,而之前只有一个方括号!区别就是,现在这个才是一个真正的1x5的矩阵,而之前的是秩为1的数组。并且如果打印a乘以a转置的结果得到了向量的外积(矩阵):

就我们刚才看到的,再进一步说明。首先我们刚刚运行的命令是这个(a=np.random.randn(5)) ,然后用a.shape命令查看结构得到一个奇怪的结构(5,),这被称为秩为1的数组。这是一个很奇怪的数据结构,所以我建议是,当在深度学习coding时,不要使用这种数组。

相反,如果你在每次创建数组的时候都能指定它的结构(是行还是列向量),那么我们将更容易理解。

 我写代码时还有一件经常做的事,那就是如果我不完全确定一个向量的维度(dimension),我经常会扔进一个断言语句(assertion statement)。

 这些断言语句会有助于为你的代码提供信息。所以不论你要做什么,不要犹豫直接插入断言语句。如果你不小心以一维数组来执行,你也能够重新改变数组维数 a = a.reshape((5,1)) ,使其成为一个(5,1)的向量或矩阵。

我有时候看见学生因为秩为1的数组的不直观的行为,导致出现难以定位bug而告终。通过在原先的代码里清除一维数组(秩为1的数组),我的代码变得更加简洁。而且实际上就我在代码中表现的事情而言,我从来不使用一维数组。因此,要去简化你的代码,而且不要使用一维数组。总是安装这种 nx1维的矩阵去构造数组,并且多使用断言语句来复查矩阵和数组的维度。不要羞于reshape操作。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值