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

Numpy添加给定行

  •  2
  • GoingMyWay  · 技术社区  · 7 年前

    A = np.ones(shape=(7, 6), dtype=np.float32)
    

    和一份清单

    v = [[0, 2], [1, 4], [3, 5, 6]]
    

    A 每一项 v v ,共有3项,用于 v[0] ,添加行 0 和排 2 我很聪明。输出的形状是 (3, 6) 输出是

    res = array([[2., 2., 2., 2., 2., 2.],
                 [2., 2., 2., 2., 2., 2.],
                 [3., 3., 3., 3., 3., 3.]])
    
    # res[0] = A[0] + A[2]
    # res[1] = A[1] + A[4]
    # res[2] = A[3] + A[5] + A[6]
    

    这里有一个更清楚的例子,给出一个矩阵

    m = [[1, 2, 3],
          [2, 3, 4],
          [1, 1, 1],
          [2, 2, 2],
          [1, 1, 1]]
    

    和要添加的行

     v = [[0, 1, 3], [2]]
    

    所以,在这里添加行 0 , 1 3 在矩阵中 m [2] ,所以结果是

    # res.shape = (2, 3)
    res[0] = m[0] + m[1] + m[3]
    res[1] = m[2]
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   timgeb    7 年前

    您可以使用奇特的索引从数组中选择行。

    对于 A :

    >>> A = np.ones(shape=(7, 6), dtype=np.float32)
    >>> v = [[0, 2], [1, 4], [3, 5, 6]]
    >>> np.array([A[rows].sum(axis=0) for rows in v])
    array([[2., 2., 2., 2., 2., 2.],
           [2., 2., 2., 2., 2., 2.],
           [3., 3., 3., 3., 3., 3.]], dtype=float32)
    

    对于 m :

    >>> m = np.array([[1, 2, 3], [2, 3, 4], [1, 1, 1], [2, 2, 2], [1, 1, 1]])
    >>> v = [[0, 1, 3], [2]]
    >>> np.array([m[rows].sum(axis=0) for rows in v])
    array([[5, 7, 9],
           [1, 1, 1]])
    

    我不知道这是否可以进一步矢量化。