【问题标题】:Replace indicator values with actual values用实际值替换指标值
【发布时间】:2019-11-06 08:21:11
【问题描述】:

我有一个像这样的 numpy 数组

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

还有一个包含值的数组

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

我想将第一个二维数组中的值替换为第二个数组中的相应值。第一个数组的每一行正好有一个 1,第二个数组只有一个替换。

结果:

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

我想要一个优雅的解决方案来实现这一点,没有循环等。

【问题讨论】:

    标签: python-3.x numpy


    【解决方案1】:

    假设a 是二维数据数组,b 是第二个一维数组。

    一个优雅的解决方案是 -

    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]
    

    【讨论】:

    • 如果我必须在分配新值之前进一步对数组进行子集化,我可以完成这项工作吗?我需要做类似a[some other condition][a==1]=b 之类的操作,其中一些其他条件首先过滤某些行?
    • @user2974951 不,不会与具有该链式索引的其他条件一起使用。您可以将索引存储在some other condition 之外,然后使用它们? some other condition 是和a 形状相同的面具吗?
    • 我试图避免将子集数组存储在新的临时变量中。 some other condition 将选择行的子集,例如第 1、2 和 5 行,列数相同。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多