前言:

这一篇文章并不是介绍一下标题中三个函数的用法,而是我在使用它们时发现了它们关于维度设置的不同。

使用其遇到的问题与理解:

numpy.array()部分:

  • *疑惑1:*numpy.array() 的返回值的维度是多少?

    例如用类似 a = numpy.array([1,2]) 这样的形式创建的向量是一维,这也是正常人想要的。但是就平时的习惯而言,向量是会分为行向量和列向量的,但是上面产生的 a 是不支持转置操作的(这里的不支持不是说 a 不能转置,而是转置之后没有改变),如下:

    nnumpy.array() 和 ones()
    图1_code
    nnumpy.array() 和 ones()
    图2_output

    代码设置解释:

    设定 a 大家肯定也一目了然,就是为了看看它的输出和它转置的输出是否一致。但我害怕有这样一种情况,即可能 a 转置是有效果的,但是 python 中是为了方便所以都将其输出成一种形式,所以我又设置了一个向量 b。因为如果 a 发生了转置(即行向量变成了列向量),那么它与 b 做内积之后,得到结果肯定分别是一个数和一个矩阵。

    结果与结论:

    最后输出的结果可以表明,用 numpy.arrary() 方法创建的向量是不区分行向量和列向量的,其存在的形式与一维数组十分类似。但是这样我就紧接着又有了一个疑惑,即疑惑2,请往下看!

  • *疑惑2:*numpy.array()返回值如何做矩阵运算?

    既然 numpy.array() 创建的向量(不妨设这个创建的向量为 a)是不区分行向量和列向量的,那么 a 在与矩阵相乘时如何处理呢?因为我们知道,根据矩阵的乘法规则,行向量想与矩阵相乘,其只能在矩阵左边;同理,列向量只能在矩阵右边。那么,numpy 是如何区别 a 在矩阵两边相乘时的不同情况的呢?

    实践与结论:

    首先实践代码如下:

    nnumpy.array() 和 ones()
    图3_code
    nnumpy.array() 和 ones()
    图4_output
    这里代码不做解释,可以看到同样是向量 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]$

    由上述可以看出,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() 一样都默认生成一个类似于一维数组的向量么?

    实践与结论:

    情况如下图:

    nnumpy.array() 和 ones()
    图5_code
    nnumpy.array() 和 ones()
    图6_output

    可以发现 ones() 和 zeros() 指定生成向量时,其生成的结果也是矩阵,也是通过如此来区分行列向量的。那么,用 ones() 和 zeros() 生成的对象进行矩阵运算得到的结果也理所当然的是矩阵,这就与上面说的 numpy.arrary() 生成的对象的运算结果类型不一致了,这样的不统一其实在写代码时还是会产生影响的。有什么可以解决这个问题的方法么?方法如下:

    方法:消除对 ones()&zeros() 的误解

    其实 ones() 和zeros() 是可以生成向量的,只是大家平时很容易理所当然的认为用 shape(n,1) 这类的写法即是一维的,事实上 ones()&zeros() 提供了生成一维对象的方式,即在写法上形如 numpy.ones((n,)) 即可(PS:括号里的 shape 不能设置成形如 (,n) )

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-12
  • 2021-11-02
  • 2021-10-04
  • 2021-10-09
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-05-15
  • 2021-09-26
  • 2021-12-26
  • 2021-05-15
  • 2021-10-08
  • 2021-10-20
相关资源
相似解决方案