Лучший способ считать больше, чем в массиве NumPy 2D - PullRequest
1 голос
/ 16 апреля 2019

результаты - это двумерный массив с размером 300000

for i in range(np.size(results,0)):  
     if results[i][0]>=0.7:  
        count+=1

это занимает 0,7 секунды в этом коде Python, но я запускаю это в коде C ++, это занимает менее 0,07 секунды.
Так каксделать этот код Python максимально быстрым?

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Вы можете попробовать следующее:

np.bincount(results[:,0]>=.7)[1]

Не уверен, что это быстрее, но должен дать правильный ответ

1 голос
/ 16 апреля 2019

При выполнении численных вычислений для скорости, особенно в Python, вы никогда не захотите использовать для циклов, если это возможно.Numpy оптимизирован для «векторизованных» вычислений, поэтому вы хотите передать работу, которую вы обычно выполняете для циклов, специальному индексированию Numpy и таким функциям, как where.

Я провел быстрый тест на массиве случайных значений 300 000 x 600 от 0 до 1 и обнаружил следующее.

Ваш код, не векторизованный с одним для цикла:
226 мс на сеанс

%%timeit
count = 0
for i in range(np.size(n,0)):  
     if results[i][0]>=0.7:  
        count+=1

emilaz Решение:
8,36 мс на сеанс

%%timeit
first_col = results[:,0]
x = len(first_col[first_col>.7])

Решение Итана:
7,84 мс за прогон

%%timeit
np.bincount(results[:,0]>=.7)[1]

Лучшее, что я придумал
6,92 мс за прогон

%%timeit
len(np.where(results[:,0] > 0.7)[0])

Все 4 метода далитот же ответ, который по моим данным был 90,134.Надеюсь, это поможет!

1 голос
/ 16 апреля 2019

Попробуйте

first_col=results[:,0]
res =len(first_col[first_col>.7])

В зависимости от формы вашей матрицы, это может быть в 2-10 раз быстрее, чем ваш подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...