Как получить счетчики для значений массивов? - PullRequest
2 голосов
/ 23 ноября 2010

Хорошо, я думаю, что это будет довольно просто, но мое глупое фу недостаточно сильное.У меня есть массив A целых;это плиточный N раз.Я хочу подсчитать количество раз, которое используется каждый элемент.

Например, следующее (я изменил массив, чтобы сделать повторение очевидным):

[0, 1, 2, 0, 0, 1, 0] \
[0, 1, 2, 0, 0, 1, 0] ...

будетстать:

[0, 0, 0, 1, 2, 1, 3] \
[4, 2, 1, 5, 6, 3, 7]

Этот код на Python делает это, хотя и неуравновешенно и медленно:

def running_counts(ar):
    from collections import defaultdict
    counts = defaultdict(lambda: 0)
    def get_count(num):
        c = counts[num]
        counts[num] += 1
        return c
    return [get_count(num) for num in ar]

Я могу почти увидеть хитрость, чтобы сделать это, ноне совсем.

Обновление

Хорошо, я сделал улучшения, но все еще полагаюсь на вышеупомянутый метод running_counts.Следующее ускоряет процесс и кажется мне правильным:

def sample_counts(ar, repititions):
    tile_bins = np.histogram(ar, np.max(ar)+1)[0]
    tile_mult = tile_bins[ar]
    first_steps = running_counts(ar)
    tiled = np.tile(tile_mult, repititions).reshape(repititions, -1)
    multiplier = np.reshape(np.arange(repititions), (repititions, 1))
    tiled *= multiplier
    tiled += first_steps
    return tiled.ravel()

Какие-нибудь изящные мысли, чтобы избавиться от running_counts()?Скорость теперь в порядке;он просто чувствует себя немного не в себе.

1 Ответ

3 голосов
/ 24 ноября 2010

Вот мое мнение:

def countify2(ar):
    ar2 = np.ravel(ar)
    ar3 = np.empty(ar2.shape, dtype=np.int32)
    uniques = np.unique(ar2)
    myarange = np.arange(ar2.shape[0])
    for u in uniques:
        ar3[ar2 == u] = myarange
    return ar3

Этот метод наиболее эффективен, когда элементов намного больше, чем уникальных.

Да, он похож на метод Свена, ноЯ действительно написал это задолго до того, как он написал.Мне просто нужно было куда-то бежать.

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