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

numpy:水平播放向量

  •  2
  • SRobertJames  · 技术社区  · 9 年前

    我在numpy中有一个一维数组 v .我想复制它以制作一个矩阵,每一行都是 .这很简单: np.broadcast_to(v, desired_shape)

    然而,如果我想治疗 v 向量,并将其复制成矩阵 柱 作为

     np.broadcast_to(v.reshape(v.shape[0], 1), desired_shape)
    

    虽然这样做有效,但我不能声称自己理解它(即使是我写的!)。

    reshape .T ).

    但是,问题的深层次原因似乎是广播只在垂直方向上工作,而不是在水平方向上。或者更正确的说法是:广播只在更高的维度上工作,而不是在较低的维度上。 我甚至不确定这是否正确。

    或者提高可读性 此代码的 ?

    2 回复  |  直到 9 年前
        1
  •  2
  •   hpaulj    9 年前

    https://en.wikipedia.org/wiki/Transpose

    https://en.wikipedia.org/wiki/Row_and_column_vectors -

    列向量或列矩阵是m 1矩阵

    In [464]: np.array([[1],[2],[3]])   # column vector
    Out[464]: 
    array([[1],
           [2],
           [3]])
    In [465]: _.shape
    Out[465]: (3, 1)
    
    In [466]: np.array([[1,2,3]])  # row vector
    Out[466]: array([[1, 2, 3]])
    In [467]: _.shape
    Out[467]: (1, 3)
    

    但是在 numpy array ,而不是向量或矩阵。

    A. 努比 数组可以有0个或更多维度。相反,在MATLAB中,矩阵有2个或更多维度。最初,MATLAB只有一个2d矩阵。

    要有意义地谈论转置,你必须至少有两个维度。一个可能大小为1,并映射到1d向量,但它仍然是一个矩阵,一个2d对象。

    reshape 或 [:,None] 不是黑客。这是一个完美有效且正常的numpy操作。

    基本广播规则是:

    • 可以在左侧(前面)自动添加尺寸为1的尺寸,以匹配尺寸的数量。

    在本例中,两个步骤均适用:(5,)=>(1,5)=>(3,5)

    In [458]: np.broadcast_to(np.arange(5), (3,5))
    Out[458]: 
    array([[0, 1, 2, 3, 4],
           [0, 1, 2, 3, 4],
           [0, 1, 2, 3, 4]])
    

    In [459]: np.broadcast_to(np.arange(5)[:,None], (5,3))
    Out[459]: 
    array([[0, 0, 0],
           [1, 1, 1],
           [2, 2, 2],
           [3, 3, 3],
           [4, 4, 4]])
    

    np.broadcast_arrays(np.arange(5)[:,None], np.arange(3)) 生成两(5,3)个数组。

    np.broadcast_arrays(np.arange(5), np.arange(3)[:,None]) makes(3,5)。

    np.broadcast_arrays(np.arange(5), np.arange(3)) 产生错误,因为它无法确定您是想要(5,3)还是(3,5)或其他内容。

        2
  •  1
  •   user2357112    9 年前

    广播总是会在左侧添加新维度,因为它很模糊,并且容易在您想要在右侧添加新维度时猜测错误。您可以通过反转轴、广播和反转来实现向右广播的功能:

    def broadcast_rightward(arr, shape):
        return np.broadcast_to(arr.T, shape[::-1]).T