【问题标题】:Numpy - how to count values in column based on binary values in other columns?Numpy - 如何根据其他列中的二进制值计算列中的值?
【发布时间】:2022-01-10 02:18:44
【问题描述】:

我有一个只有二进制值的 2d numpy 数组,我正在尝试根据具有同一行的其他列的二进制组合来计算列中 1 的数量。

假设我有:

[[0,0,0,0],
[1,0,1,0],
[0,0,0,1],
[1,0,0,0],
[0,1,0,0],
[1,0,1,0]]

并且我希望能够计算第一列中 1 的数量,其中同一行中的其他列具有值 [0, 1, 0]。我需要我的代码返回2。第 1 行和第 5 行就是这种情况。

我尝试使用掩码执行此操作,但它没有返回我正在寻找的结果:

test = numpy.asarray(
    [[0,0,0,0],
    [1,0,1,0],
    [0,0,0,1],
    [1,0,0,0],
    [0,1,0,0],
    [1,0,1,0]])
mask = test[:,[1, 2, 3]] == [0,1,0]
mask

返回

array([[ True, False,  True],
       [ True,  True,  True],
       [ True, False, False],
       [ True, False,  True],
       [False, False,  True],
       [ True,  True,  True]])

假设掩蔽是正确的方法,有什么建议可以在我得到这个掩蔽后下一步做什么?

【问题讨论】:

    标签: python numpy binary 2d mask


    【解决方案1】:

    您希望每行中的所有三个元素都匹配[0,1,0],因此您的mask 应该是:

    mask = (test[:,1:] == [0,1,0]).all(axis=1)
    out = test[mask,0].sum()
    

    输出:

    2
    

    如果您想在对应于相同配置的第一列中计数零,则在上面的mask 中添加第一列中的 0 过滤器:

    out2 = test[mask&(test[:,0]==0),0].shape[0]
    

    【讨论】:

    • 如果第 1 到第 3 列与模式匹配,该问题要求计算第 0 列中 1 的数量。所以你的答案需要以arr[ :, 0][ mask].sum()而不是len( test[mask])结尾。在显示的示例中,您给出相同的结果,但可能与其他数据不同。
    • @TlsChris 你是对的。我错过了那部分。编辑以反映这一点。谢谢。
    • 感谢您的回复。但是如果我想计算第一列中对应于相同二进制配置的零,我还能使用all 参数
    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 2019-03-09
    • 2019-04-17
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2022-07-08
    相关资源
    最近更新 更多