识别数组中的重复行并总结另一个数组中的相应值

时间:2015-03-23 15:02:42

标签: python arrays numpy duplicates unique

假设有一个包含结果的数组和一个包含概率的数组。可能是某些结果被多次列出的情况。例如:

import numpy as np
x = np.array(([0,0],[1,1],[2,1],[1,1],[2,2]),dtype=int)
p = np.array([0.1,0.2,0.3,0.1,0.2],dtype=float)

现在我想列出x中的独特结果,并在重复结果的p中加上相应的概率。因此结果应该是数组xnewpnew定义为

xnew = np.array(([0,0],[1,1],[2,1],[2,2]),dtype=int)
pnew = np.array([0.1,0.3,0.3,0.2],dtype=float)

虽然有一些如何获取唯一行的示例,但请参阅,例如Removing duplicate columns and rows from a NumPy 2D array,我不清楚如何使用它来在另一个数组中添加值。

有人有建议吗?使用numpy的解决方案是首选。

3 个答案:

答案 0 :(得分:1)

bincount可以为您汇总p数组,您只需要为a中的每个唯一行创建一个唯一的ID号。如果您使用排序方法来识别唯一行,那么创建唯一ID非常容易。一旦对行生成了一个diff数组进行排序,你就可以{diff}数组cumsum。例如:

  x    diff cumsum
[0, 0]  1    1
[0, 0]  0    1
[0, 1]  1    2
[0, 2]  1    3
[1, 0]  1    4
[1, 0]  0    4
[1, 0]  0    4
[1, 0]  0    4
[1, 0]  0    4
[1, 1]  1    5

在代码中,它看起来像这样:

import numpy as np

def unique_rows(a, p):
    order = np.lexsort(a.T)
    a = a[order]
    diff = np.ones(len(a), 'bool')
    diff[1:] = (a[1:] != a[:-1]).any(-1)
    sums = np.bincount(diff.cumsum() - 1, p[order])
    return a[diff], sums

答案 1 :(得分:1)

这是一个典型的分组问题,可以使用numpy_indexed包以完全向量化的方式解决(披露:我是它的作者):

import numpy_indexed as npi
xnew, pnew = npi.group_by(x).sum(p)

答案 2 :(得分:0)

不使用numpy,但可以使用字典

来收集类似的值
import numpy as np
x = np.array(([0,0],[1,1],[2,1],[1,1],[2,2]),dtype=int)
p = np.array([0.1,0.2,0.3,0.1,0.2],dtype=float)

#Initialise dictonary
pdict = {}
for i in x:
    pdict[str(i)] = []

#Collect same values using keys
for i in range(x.shape[0]):
    pdict[str(x[i])].append(p[i])

#Sum over keys
xnew = []; pnew = []
for key, val in pdict.items():
    xnew.append(key)
    pnew.append(np.sum(val))

print('xnew = ',np.array(xnew))
print('pnew = ',np.array(pnew))

我已将xnew值保留为字符串,可以将其转换回具有某种形式拆分的列表。