2010-10-13 80 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