Просмотр numpy.unique
и numpy.bincount
.
1009 * Е.Г. *
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
Редактировать: Извините, я неправильно понял ваш вопрос ...
Один из способов получить уникальные строки - это просматривать вещи как структурированный массив ...
В вашем случае у вас есть двумерный массив bools. Так может что-то вроде этого?
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
Как это происходит, любой из этих вариантов оказывается быстрее, чем "тупой" способ сделать это ... (Я бы догадался об обратном! медленный, хотя. Вы определенно хотите сравнить кортежи вместо строк).