Сравнение строки в массиве NumPy - PullRequest
3 голосов
/ 13 октября 2010

У меня есть двумерный массив болванов, и я хотел бы знать, сколько уникальных строк содержит мой набор данных и частоту каждой строки.Единственный способ решить эту проблему - преобразовать весь набор данных в строку, а затем выполнить сравнение, но, безусловно, должен быть лучший способ сделать это.Любая помощь приветствуется.

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

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Просмотр 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

Как это происходит, любой из этих вариантов оказывается быстрее, чем "тупой" способ сделать это ... (Я бы догадался об обратном! медленный, хотя. Вы определенно хотите сравнить кортежи вместо строк).

0 голосов
/ 08 августа 2012

Мне нравится решение, которое полезно:

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

Это очень быстро. Моя единственная забота: возможно выполнить то же самое, используя unique в качестве массива, а не как dict()? У меня проблемы с печатью уникального словаря без формата словаря. Спасибо Джузеппе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...