Как использовать NumPy для больших наборов данных - PullRequest
0 голосов
/ 17 июня 2019

У меня действительно большой набор точек данных (не менее 1 миллиона).Я использую pyFFTW, чтобы сделать БПФ.Чтобы получить значения оси x, я использую x = np.linespace(0.0, 1.0 / (2.0 * T), len(fft_data))

Мне нужно вернуть все значения FFT в виде списка списков (например: [[x1, y1], [x2, y2]]).

Я использую этот код:

for i, item in enumerate(x):
    result.append([item, 2.0 / N * abs(fft_data[i])])

Проблема в том, что мой цикл for должен повторять 500 000 элементов, и это не так быстро, как я хочу.Это займет около 13 секунд на моем компьютере.Есть ли способ сделать это быстрее?Я думаю использовать numpy, но у меня не так много опыта с этим.

Одним из улучшений, которое я смог использовать, было проверить, меньше ли 2.0 / N * abs(fft_data[i]), чем 0,001.Мне не нужно возвращать значения, которые слишком малы, потому что они не имеют отношения к моему приложению.

У вас есть идеи, как я могу ускорить алгоритм?

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

IIUC, всего

y = 2.0 / N * np.abs(fft_data)

и hstack

np.hstack([x.reshape(-1,1),
           y.reshape(-1,1)])
1 голос
/ 18 июня 2019

Vectorize!

result = np.array([x, np.abs(fft_data) * 2.0/N])

...