Я пытаюсь выработать более эффективный способ сделать это. Вот моя проблема: есть массив (m, n, 2)
numpy. Чтобы прояснить ситуацию, я буду называть измерения населением, выборками, а для каждой выборки 0-й столбец - это частота, а 1-й столбец - это амплитуда. Для каждого образца некоторые частоты повторяются, но амплитуды различны. То, что я хочу, - это эффективный способ выбора одной (и только одной) случайной амплитуды для каждой частоты и помещения ее в выходной массив. Пример, чтобы прояснить ситуацию. Предположим, что mth выборка:
1, 2
2, 3
2, 4
3, 5
, а результат должен быть
1, 2
2, 4 (random choice between 3 and 4)
3, 5
Кроме того, частоты в выходном массиве должны быть частотами, присутствующими в другом списке, называемом freq_compare
. У меня есть рабочий код, но это занимает некоторое время. Если это помогает, частоты сортируются, но я не знаю заранее, сколько будет дубликатов (если есть), и какие частоты будут дублироваться.
Вот что у меня есть:
def make_dict(sample):
"""Produce a dictionary with the frequencies as keys and amplitudes as values."""
per_freq = dict()
freqs = list(set(sample[:,0]))# get list of all frequencies
for f in freqs:
per_freq[f] = [line[1] for line in sample if line[0] == f]
return per_freq
output_random = np.zeros((m, len(freq_compare), 2))
for i in range(m):
d = make_dict(all_data[i]) #original array
keys = list(d.keys())
for j in range(len(freq_compare)):
if freq_compare[j] in keys:
amp = np.random.choice(d[freq_compare[j]])
output_random[i,j,:] = (freq_compare[j], amp)
else:
output_random[i,j,:] = (freq_compare[j], 0.0)
Выполнение этого 10 раз заняло около 15 минут для массива формы (3000, 400, 2)
. Есть ли более эффективный способ? Может быть, построение словаря, когда я перебираю строки?
Большое спасибо