Python 将数组中的重复行折叠为单个唯一行

Python 将数组中的重复行折叠为单个唯一行,python,arrays,algorithm,numpy,Python,Arrays,Algorithm,Numpy,给定一个具有多个列和行的二维数组(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 ro

给定一个具有多个列和行的二维数组(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巧妙地操纵数组来创建这些数组?谢谢:)

您可以使用
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。我刚刚修复了一个bug,请确保使用最新版本。@deineomaklaut刚刚看到您不关心订单。在这种情况下,您可以省去整个第二个块,在第三个块中省去索引。好的,可以。你的名字让我想起那时我还在车里听NDR2的时候。