代码之家  ›  专栏  ›  技术社区  ›  mins

Numpy和线性代数:如何对Axêy进行编码?

  •  1
  • mins  · 技术社区  · 1 年前

    在线性代数中,用形状来表示点积和向量时,我很难匹配Numpy的期望。

    假设我有一个矩阵和两个列向量,由Numpy数组表示:

    import numpy as np
    
    A = np.array([[1,2],
                  [3,1],
                  [-5,2]])
    
    x = np.array([[0],
                  [2]])
    
    y = np.array([[-2],
                  [0],
                  [3]])
    

    我想计算 Axꞏy , Ax 是矩阵乘法和 ꞏ 是点积。这不起作用:

    # a = Axꞏy
    a = (A @ x).dot(y)
    

    形状(3.1)和(3.1)未对齐:1(dim 1)!=3(调光0)

    Ax :

    [[4],
     [2],
     [4]]
    

    实际上是列向量,并且两个列向量的点积是标量: -8+0+12=4 ,这是我期待的结果。

    使用定义的矢量,需要什么样的正确操作或整形?

    1 回复  |  直到 1 年前
        1
  •  2
  •   mozway    1 年前

    你不能计算两者之间的点积 (3, 1) 数组,点积 A @ B 仅当的形状 A B (n, k) (k, m)

    看起来您想要:

    (A@x).T @ y
    

    输出: [[4]]

    或作为标量:

    ((A@x).T @ y).item()
    

    输出: 4

    注:。在2D阵列的上下文中 @ dot 是等效的。


    在给定形状的情况下有效的其他操作:

    (A@x) @ y.T
    
    array([[-8,  0, 12],
           [-4,  0,  6],
           [-8,  0, 12]])
    
    
    (A.T*x) @ y
    
    array([[0],
           [4]])