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

用实际值替换指示器值

  •  0
  • user2974951  · 技术社区  · 5 年前

    我有一个像这样的numpy数组

    array([[0, 0, 1],
           [1, 0, 0],
           [0, 1, 0],
           [0, 0, 1]])
    

    以及一个包含值的数组

    array([1, 2, 3, 4])
    

    结果:

    array([[0, 0, 1],
           [2, 0, 0],
           [0, 3, 0],
           [0, 0, 4]])
    

    1 回复  |  直到 5 年前
        1
  •  2
  •   Divakar    5 年前

    比如说 a 是二维数据数组 b 第二个1D阵列。

    一个优雅的解决方案是-

    a[a==1] = b
    

    为了提高性能,利用一个事实 1 每行,我们还可以使用 indexing -

    a[np.arange(len(a)),a.argmax(1)] = b
    

    有选择地按行分配

    如果我们想有选择地屏蔽和分配每行的值,我们可以使用一个更高级别的屏蔽。所以,假设我们有要选择的行-

    select_rows = np.array([1,3])
    

    然后,我们可以-

    rowmask = np.isin(np.arange(len(a)),select_rows)
    

    因此,对于第一种方法的替换将是-

    a[(a==1) & rowmask[:,None]] = b[rowmask]
    

    第二个呢-

    a[np.arange(len(a))[rowmask],a.argmax(1)[rowmask]] = b[rowmask]