Я не думаю, что здесь возникает проблема с вводом-выводом, поскольку даже для этого большого массива:
np.empty(1000000000, 'i').tofile('abc.bin')
np.fromfile('abc.bin', 'i')
Для его чтения требуется всего
1.18 s ± 26.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
.Если вы настаиваете, вы можете использовать memmap
:
np.memmap('abc.bin', 'i')
, который занимает «незначительное время» для «загрузки», но все равно придется выполнить IO позже:
5.6 µs ± 433 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
С другойстороны, если под повторной выборкой вы имеете в виду понижающую выборку, вы можете использовать метод memmap
, описанный выше, и напрямую сохранить фрагмент массива оригиналов, например
memmap_result[::2].tofile('xxx')
, который уменьшит выборки вдвое.
Если вам нужна нецелочисленная пошаговая выборка или повышающая выборка, и, что более важно, вам подходит метод ближайшего соседа, вы можете использовать необычную индексацию, например:
memmap_result[np.linspace(0, len(memmap_result), num_samples).astype('i')]
, которая также должнаБыть быстрым.
В других случаях вам может потребоваться поискать другие алгоритмы повторной выборки.Я вижу, scipy.signal.resample
использует преобразование Фурье, которое должно быть довольно быстрым и стабильным.Вы можете использовать еще более быстрые алгоритмы, такие как линейная интерполяция и т. Д. Но это может повлиять на качество повторной выборки.