Повышение скорости кода при использовании numpy.apply_along_axis - PullRequest
0 голосов
/ 06 июня 2019

У меня есть функция, которая принимает массив из двух элементов в качестве входных данных.Теперь у меня есть большие данные (shape = (360000,2)) и я хочу оценить функцию в каждой точке, используя numpy.apply_along_axis.В одном из ответов, приведенных в этой теме ( функция numpy np.apply_along_axis ускоряется? ), говорится, что numpy.apply_along_axis не для скорости.Моя функция векторизована.Как я могу улучшить время эволюции для всех моих данных без использования jit / cython.

Я включу пример кода того, что я пытаюсь сделать, точно

import numpy as np
import random
def sample(x):
    return np.sin(x[0])*np.cos(x[1])
data = np.random.normal(size=600*600*2)
data = data.reshape(600*600,2)
%timeit np.sum(np.apply_along_axis(sample, 1,data)) #using the apply_along_axis

def loop_way():  # using loop
    result = []
    for i in data:
        result += [sample(i)]
    return np.sum(result)
%timeit loop_way()


output when using np. apply_along_axis: 1 loop, best of 3: 4.06 s per loop

output for loop_way function: 1 loop, best of 3: 2.41 s per loop

1 Ответ

4 голосов
/ 06 июня 2019

np.sin и * являются векторизованными операциями, поэтому их можно применять ко всем массивам:

np.sin(data[:, 0]) * np.cos(data[:, 1])

data[:, 0] - первый столбец, а data[:, 1] - второй.

Обратите внимание, что это должно идти очень быстро:)


Вот записная книжка, которая проверяет скорость каждого метода: Записная книжка .

Среднее время выполнения:

  • Метод 1 (с использованием numpy.apply_along_axis): 2,08 с
  • Метод 2 (циклическое применение функции к строкам): 1,14 с
  • Метод 3 (этот ответ): 17,3мс
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...