2010-10-13 68 views
3

我有一个2d numpy数组的布尔值,我想知道我的数据集包含多少个唯一行以及每行的频率。我可以解决这个问题的唯一方法是将我的整个数据集转换为一个字符串,然后进行比较,但肯定必须有更好的方法来做到这一点。任何帮助表示赞赏。比较numpy数组中的行

def getUniqueHaplotypes(self,data): 
nHap=data.shape[0] 
unique=dict() 
for i in range(nHap): 
    s = "".join([str(j) for j in data[i]]) 
    if unique.has_key(s): 
     unique[s]+=1 
    else: 
     unique[s] = 1 

return unique 
+0

我不认为你的方式是如此糟糕,虽然我会使用行的元组作为键,而不是将行转换为字符串。也就是说,我认为乔金顿的方法非常好。 – 2010-10-13 04:19:48

+0

我会继续介绍贾斯汀所说的话:你已经在做事情的方式没有任何问题。事实上,如果你使用贾斯汀建议的元组并直接遍历数组的行('for data in row:'),它实际上比我下面的方法快。 – 2010-10-13 16:25:11

+0

你可以从http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array获得很多好的想法解决方案 – j08lue 2016-12-02 12:25:31

回答

2

调查numpy.uniquenumpy.bincount

E.g.

import numpy as np 
x = (np.random.random(100) * 5).astype(np.int) 
unique_vals, indicies = np.unique(x, return_inverse=True) 
counts = np.bincount(indicies) 

print unique_vals, counts 

编辑:对不起,我误解你的问题......

一种方式来获得唯一的行是看待事物的结构数组...

在你的情况,你有二维数组布尔。所以也许这样?

import numpy as np 
numrows, numcols = 10,3 
x = np.random.random((numrows, numcols)) > 0.5 
x = x.view(','.join(numcols * ['i1'])) # <- View the rows as a 1D structured array... 

unique_vals, indicies = np.unique(x, return_inverse=True) 
counts = np.bincount(indicies) 

print unique_vals, counts 

当然,没有什么真的错了你最初做的方式...只是展现给写你的原始功能略有更清洁的方式(使用元组,贾斯汀建议):

def unique_rows(data): 
    unique = dict() 
    for row in data: 
     row = tuple(row) 
     if row in unique: 
      unique[row] += 1 
     else: 
      unique[row] = 1 
    return unique 

我们可以借此一步越走越使用defaultdict:

from collections import defaultdict 
def unique_rows(data): 
    unique = defaultdict(int) 
    for row in data: 
     unique[tuple(row)] += 1 
    return unique 

碰巧,这些选项似乎比做它的“numpy的-thonic”的方式更快...(我将猜对了!尽管如此,将行转换为字符串仍然很慢。你一定要比较元组而不是字符串)。

0

我喜欢的解决方案,它是有帮助的:

def unique_rows(data): 
    unique = dict() 
    for row in data: 
     row = tuple(row) 
     if row in unique: 
      unique[row] += 1 
     else: 
      unique[row] = 1 
    return unique 

这是非常快。我唯一担心的是:可能使用独特的数组执行相同的操作,而不是像dict()?我无法打印没有字典格式的独特字典。 谢谢朱塞佩

+0

这对于一个令人难以置信的大型阵列来说有多快,看起来像你正在复制一切,而不是在原地查看......(所以我猜测它很慢?) – 2012-09-27 12:37:31