关于 python_numpy 向量的说明

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

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

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

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

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

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

就刚才看到的,再进一步说明。首先刚刚运行的命令是这个 \((a=np.random.randn(5))\),它生成了一个数据结构\(a\),其中\(a.shape\)是\((5,)\)。这被称作 \(a\) 的一维数组,同时这也是一个非常有趣的数据结构。它不像行向量和列向量那样表现的很一致,这使得它带来一些不直观的影响。所以本人建议,当在编程练习或者在执行逻辑回归和神经网络时,不需要使用这些一维数组。

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

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

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

总之,本人希望这些建议能帮助解决一个Python中的bug。

神经网络基础篇:关于 python_numpy 向量的说明(A note on python or numpy vectors)的更多相关文章

  1. 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇

    [原创 深度学习与TensorFlow 动手实践系列 - 3]第三课:卷积神经网络 - 基础篇 提纲: 1. 链式反向梯度传到 2. 卷积神经网络 - 卷积层 3. 卷积神经网络 - 功能层 4. 实 ...

  2. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  3. 基础篇|一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  4. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

  5. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

  6. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  7. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  8. Zigbee安全基础篇Part.3

    原文地址: https://www.4hou.com/wireless/14294.html 导语:在之前的文章中提供了ZigBee协议及其安全功能的简要概述.在本文中,我们将探讨可在ZigBee网络 ...

  9. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  10. 动手学习Pytorch(6)--卷积神经网络基础

    卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义.   二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据.   二维 ...

随机推荐

  1. Java多线程笔记全过程(一)

    一.多线程最基础的基本概念 一个程序最少需要一个进程,而一个进程最少需要一个线程. 我们常说的高并发,也并不全是线程级别的并发,在很多开发语言中,比如PHP,很常见的都是进程级别的并发.但是在Java ...

  2. 【RocketMQ】RocketMQ 5.0新特性(三)- Controller模式

    在RocketMQ 5.0以前,有两种集群部署模式,分别为主从模式(Master-Slave模式)和Dledger模式. 主从模式 主从模式中分为Master和Slave两个角色,集群中可以有多个Ma ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (120)-- 算法导论10.3 5题

    五.用go语言,设 L 是一个长度为 n 的双向链表,存储于长度为 m 的数组key.prev 和next 中.假设这些数组由维护双链自由表 F的两个过程 ALLOCATE-OBJECT 和 FREE ...

  4. 3.MongoDB-备份恢复

    备份工具 (1)** mongoexport/mongoimport (2)***** mongodump/mongorestore 备份工具区别在那里? 应用场景总结: mongoexport/mo ...

  5. 实战|如何低成本训练一个可以超越 70B Llama2 的模型 Zephyr-7B

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  6. LangChain实战

    1.概述 最近,在研究LangChain时,发现一些比较有意思的点,今天笔者将给大家分享关于LangChain的一些内容. 2.内容 2.1 什么是LangChain? LangChain是一项旨在赋 ...

  7. JavaScript:数据类型详解

    ECMAScript中数据类型目前有两种:基本数据类型和引用数据类型. 基本数据类型 基本数据类型也称作简单数据类型,为Undefined,Null,Boolean,Number,String,Sym ...

  8. 【Vue3响应式原理#02】Proxy and Reflect

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 背景 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第二节, ...

  9. 【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固

    ​ 摘要 在开发iOS应用时,保护应用程序的安全是非常重要的.本文将介绍一种使用ipaguard混淆加固的方法来保护iOS应用的安全.通过字符串混淆.类名和方法名混淆.程序结构混淆加密以及反调试.反注 ...

  10. java中ArrayList和LinkedList的区别

    Java中ArrayList和LinkedList都是List集合的实现类,它们都可以用来存储一组有序的元素,但是它们的内部实现方式不同,在使用时也有不同的适用场景. ArrayList是一个基于动态 ...