Хорошо, я думаю, что это будет довольно просто, но мое глупое фу недостаточно сильное.У меня есть массив 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()
?Скорость теперь в порядке;он просто чувствует себя немного не в себе.