在numpy中解释昏暗,形状,等级,尺寸和轴之间的差异

Jac*_*ain 9 python arrays numpy matrix

我是python和numpy的新手.我阅读了几个教程,但仍然对昏暗,等级,形状,aix和尺寸的差异感到困惑.我的想法似乎停留在矩阵表示.所以如果你说A是一个看起来像这样的矩阵:

A = 

1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)

那么我能想到的只是一个2x3矩阵(两行三列).在这里,我知道形状是2x3.但我真的无法超越二维矩阵的思维.我不明白例如dot()文档,当它表示"对于N维,它是a的最后一个轴上的和产品,而b的倒数第二个".我很困惑,无法理解这一点.我不明白,如果V是N:1向量而M是N:N矩阵,点(V,M)或点(M,V)如何工作以及它们之间的差异.

那么有人可以向我解释什么是N维数组,什么是形状,什么是轴以及它如何与dot()函数的文档相关?如果解释可视化这些想法会很棒.

Fre*_*Foo 11

NumPy数组的维度必须在数据结构意义上理解,而不是数学意义,即它是获取标量值所需的标量索引的数量.(*)

例如,这是一个三维数组:

>>> X = np.arange(24).reshape(2, 3, 4)
>>> X
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
Run Code Online (Sandbox Code Playgroud)

索引一次给出一个二维数组(矩阵):

>>> X[0]
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
Run Code Online (Sandbox Code Playgroud)

索引两次给出1-d数组(向量),索引三次给出标量.

等级X是它的维数:

>>> X.ndim
3
>>> np.rank(X)
3
Run Code Online (Sandbox Code Playgroud)

Axis大致是维度的同义词; 它用于广播业务:

>>> X.sum(axis=0)
array([[12, 14, 16, 18],
       [20, 22, 24, 26],
       [28, 30, 32, 34]])
>>> X.sum(axis=1)
array([[12, 15, 18, 21],
       [48, 51, 54, 57]])
>>> X.sum(axis=2)
array([[ 6, 22, 38],
       [54, 70, 86]])
Run Code Online (Sandbox Code Playgroud)

说实话,我发现这个"等级"的定义令人困惑,因为它既不匹配属性的名称ndim也不匹配线性代数定义.

现在np.dot,你需要了解的是,在NumPy中有三种表示向量的方法:1-d数组,形状的列向量(n, 1)或形状的行向量(1, n).(实际上,有更多的方法,例如作为一个(1, n, 1)形状的数组,但这些很少见.)np.dot当两个参数都是1-d时执行向量乘法,当一个参数是1-d时执行矩阵向量乘法,另一个是2- d,否则执行(广义)矩阵乘法:

>>> A = np.random.randn(2, 3)
>>> v1d = np.random.randn(2)
>>> np.dot(v1d, A)
array([-0.29269547, -0.52215117,  0.478753  ])
>>> vrow = np.atleast_2d(v1d)
>>> np.dot(vrow, A)
array([[-0.29269547, -0.52215117,  0.478753  ]])
>>> vcol = vrow.T
>>> np.dot(vcol, A)
Traceback (most recent call last):
  File "<ipython-input-36-98949c6de990>", line 1, in <module>
    np.dot(vcol, A)
ValueError: matrices are not aligned
Run Code Online (Sandbox Code Playgroud)

规则"在最后一轴a和倒数第二轴上求和产品b"匹配并推广矩阵乘法的通用定义.

(*)数组dtype=object有点例外,因为它们将任何Python对象视为标量.


zha*_*hen 1

就你而言,

  1. A是一个二维数组,即矩阵,其形状为(2, 3)。来自文档字符串 numpy.matrix

    矩阵是一种特殊的二维数组,通过运算保留其二维性质。

  2. numpy.rank返回数组的维数,这与线性代数中的秩概念有很大不同,例如A是维数/秩为2的数组。

  3. np.dot(V, M),或V.dot(M)将矩阵V与相乘M。请注意,numpy.dot 尽可能执行乘法。如果 V 是 N:1 并且 M 是 N:NV.dot(M)则会引发ValueError

例如:

In [125]: a
Out[125]: 
array([[1],
       [2]])

In [126]: b
Out[126]: 
array([[2, 3],
       [1, 2]])

In [127]: a.dot(b)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-127-9a1f5761fa9d> in <module>()
----> 1 a.dot(b)

ValueError: objects are not aligned
Run Code Online (Sandbox Code Playgroud)

编辑:

我不明白 (N,) 和 (N,1) 的形状之间的区别,它与 dot() 文档相关。

V形状 (N,) 表示长度为 N 的一维数组,而形状 (N, 1) 表示具有 N 行、1 列的 2D 数组:

In [2]: V = np.arange(2)

In [3]: V.shape
Out[3]: (2,)

In [4]: Q = V[:, np.newaxis]

In [5]: Q.shape
Out[5]: (2, 1)

In [6]: Q
Out[6]: 
array([[0],
       [1]])
Run Code Online (Sandbox Code Playgroud)

正如文档字符串所说np.dot

对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复杂的共轭)。

如果参数之一是向量,它还会执行向量矩阵乘法。说V.shape==(2,); M.shape==(2,2)

In [17]: V
Out[17]: array([0, 1])

In [18]: M
Out[18]: 
array([[2, 3],
       [4, 5]])

In [19]: np.dot(V, M)  #treats V as a 1*N 2D array
Out[19]: array([4, 5]) #note the result is a 1D array of shape (2,), not (1, 2)

In [20]: np.dot(M, V)  #treats V as a N*1 2D array
Out[20]: array([3, 5]) #result is still a 1D array of shape (2,), not (2, 1)

In [21]: Q             #a 2D array of shape (2, 1)
Out[21]: 
array([[0],
       [1]])

In [22]: np.dot(M, Q)  #matrix multiplication
Out[22]: 
array([[3],            #gets a result of shape (2, 1)
       [5]])
Run Code Online (Sandbox Code Playgroud)