【问题标题】:Collapse duplicate rows in an array into a single unique row将数组中的重复行折叠成一个唯一行
【发布时间】:2020-07-14 22:12:55
【问题描述】:

给定一个具有多列和多行的二维数组 (A) 和一个长度相同的一维数组 (B)。 (A) 包含重复的行,我想将这些重复的行折叠到一个唯一的条目中,但在 (B) 中添加相应的值。目前我正在使用字典来解决这个问题,但如果数组很长,我认为它并不理想而且太慢:

example_keys = [[1,0,0,0], [1,1,0,0], [1,1,1,0], [1,0,0,0]]
example_vals = [[2], [3], [1], [10]]
example_dict = {}
i = 0

for row in example_keys:

    state_key = tuple(row)

    if state_key in example_dict:
        # Just add value
        example_dict[state_key] += example_vals[i]
    else:
        # Create entry
        example_dict[state_key] = example_vals[i]

    i += 1

我想要的输出是这两个数组:

edited_keys = [[1,0,0,0], [1,1,0,0], [1,1,1,0]]
edited_vals = [[12], [3], [1]]

数组的顺序无关紧要,只要数组之间的行是一致的。这也需要处理多个重复的行,而不仅仅是两个。有没有办法通过使用 numpy 巧妙地操作数组来创建这些数组?谢谢:)

【问题讨论】:

    标签: python arrays algorithm numpy


    【解决方案1】:

    你可以使用np.unique:

    unq,idx,inv = np.unique(example_keys,axis=0,return_inverse=1,return_index=1)
    
    # change idx order to order of appearance
    aux = np.bincount(idx)
    nz = aux.nonzero()
    aux[idx] = np.arange(idx.size)
    idx = aux[nz]
    
    new_keys = unq[idx]
    new_vals = np.bincount(inv,np.ravel(example_vals))[idx[:,None]]
    
    new_keys
    # array([[1, 0, 0, 0],
    #        [1, 1, 0, 0],
    #        [1, 1, 1, 0]])
    new_vals
    # array([[12.],
    #        [ 3.],
    #        [ 1.]])
    

    【讨论】:

    • @deineomaklaut Danichfuer。我刚刚修复了一个错误,请确保使用最新版本。
    • @deineomaklaut 刚刚看到您不关心订单。在这种情况下,您可以省略整个第二个块和第三个块中的索引。
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2019-10-08
    • 2016-01-02
    • 1970-01-01
    • 2020-03-20
    • 2022-08-18
    相关资源
    最近更新 更多