前言:
这一篇文章并不是介绍一下标题中三个函数的用法,而是我在使用它们时发现了它们关于维度设置的不同。
使用其遇到的问题与理解:
numpy.array()部分:
-
*疑惑1:*numpy.array() 的返回值的维度是多少?
例如用类似 a = numpy.array([1,2]) 这样的形式创建的向量是一维,这也是正常人想要的。但是就平时的习惯而言,向量是会分为行向量和列向量的,但是上面产生的 a 是不支持转置操作的(这里的不支持不是说 a 不能转置,而是转置之后没有改变),如下:
图1_code 图2_output 代码设置解释:
设定 a 大家肯定也一目了然,就是为了看看它的输出和它转置的输出是否一致。但我害怕有这样一种情况,即可能 a 转置是有效果的,但是 python 中是为了方便所以都将其输出成一种形式,所以我又设置了一个向量 b。因为如果 a 发生了转置(即行向量变成了列向量),那么它与 b 做内积之后,得到结果肯定分别是一个数和一个矩阵。
结果与结论:
最后输出的结果可以表明,用 numpy.arrary() 方法创建的向量是不区分行向量和列向量的,其存在的形式与一维数组十分类似。但是这样我就紧接着又有了一个疑惑,即疑惑2,请往下看!
-
*疑惑2:*numpy.array()返回值如何做矩阵运算?
既然 numpy.array() 创建的向量(不妨设这个创建的向量为 a)是不区分行向量和列向量的,那么 a 在与矩阵相乘时如何处理呢?因为我们知道,根据矩阵的乘法规则,行向量想与矩阵相乘,其只能在矩阵左边;同理,列向量只能在矩阵右边。那么,numpy 是如何区别 a 在矩阵两边相乘时的不同情况的呢?
实践与结论:
首先实践代码如下:
这里代码不做解释,可以看到同样是向量 a 与 矩阵 b 做矩阵乘法,但输出的结果确实不同的。手动验算一下就可以发现上面的两个输出的结果分别对应的是 $\left[\begin{matrix} 1&1 \end{matrix}\right]\cdot\left[\begin{matrix} 1&1\\2&2 \end{matrix}\right]$ 和 $\left[\begin{matrix} 1&1\\2&2 \end{matrix}\right]\cdot\left[\begin{matrix} 1\\1 \end{matrix}\right]$图3_code 图4_output 由上述可以看出,numpy 在完成 numpy.array() 创建的向量和矩阵相乘时是由函数来区分行列向量的不同的。
为了和下面的 ones、zeros 作比较,这里提前说一个现象,即上面的 output 的两个结果均是一个向量(即一维的)。
ones()&zeros()部分:
-
疑惑1:ones()&zeros() 不能返回向量?
通过上面的实践之后,我弄明白了 numpy 对 numpy.array() 设计的思路。然后我们知道创建 ndarray 类型对象的方法还有 ones()& zeros() 等,并且 ones() 和 zeros() 可以指定生成矩阵的 shape,那么当我用它们创建 shape 分别为 (2,1) 和 (1,2) 两种形状的向量时,也会像 numpy.array() 一样都默认生成一个类似于一维数组的向量么?
实践与结论:
情况如下图:
图5_code 图6_output 可以发现 ones() 和 zeros() 指定生成向量时,其生成的结果也是矩阵,也是通过如此来区分行列向量的。那么,用 ones() 和 zeros() 生成的对象进行矩阵运算得到的结果也理所当然的是矩阵,这就与上面说的 numpy.arrary() 生成的对象的运算结果类型不一致了,这样的不统一其实在写代码时还是会产生影响的。有什么可以解决这个问题的方法么?方法如下:
方法:消除对 ones()&zeros() 的误解
其实 ones() 和zeros() 是可以生成向量的,只是大家平时很容易理所当然的认为用 shape(n,1) 这类的写法即是一维的,事实上 ones()&zeros() 提供了生成一维对象的方式,即在写法上形如 numpy.ones((n,)) 即可(PS:括号里的 shape 不能设置成形如 (,n) )