調查numpy.unique
和numpy.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」的方式更快...(我將猜對了!儘管如此,將行轉換爲字符串仍然很慢。你一定要比較元組而不是字符串)。
我不認爲你的方式是如此糟糕,雖然我會使用行的元組作爲鍵,而不是將行轉換爲字符串。也就是說,我認爲喬金頓的方法非常好。 – 2010-10-13 04:19:48
我會繼續介紹賈斯汀所說的話:你已經在做事情的方式沒有任何問題。事實上,如果你使用賈斯汀建議的元組並直接遍歷數組的行('for data in row:'),它實際上比我下面的方法快。 – 2010-10-13 16:25:11
你可以從http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array獲得很多好的想法解決方案 – j08lue 2016-12-02 12:25:31