Как ускорить построчное сравнение? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть массив индексов, некоторые из которых являются повторениями, и я хочу просмотреть все уникальные значения и определить, какой экземпляр данного индекса соответствует наибольшему значению массива такой же длины. У меня есть рабочий код для этого, но для прохождения сотен тысяч (иногда миллионов) индексов требуется время, и мне было интересно, есть ли более быстрый путь. Я подозреваю, что мое использование np.append является проблемой, но я не нашел лучшего способа.

import numpy as np

# Randomly draw 100,000 integers between 1 and 100,000 as an example
index_list = np.random.randint(low=1, high=100000, size=100000)
# The data array being indexed
vals = np.linspace(1.,100000.,100000)

unique_index = np.unique(index_list)

biggest = []
for line in unique_index:   
    biggest = np.append(biggest,max(vals[np.where(index_list == line)]))

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете использовать лямбда-выражение, чтобы сократить время операции. Лямбда будет работать на секунду быстрее для вашего примера.

result = list(map(lambda x : max(vals[np.where(index_list == x)]),unique_index))

РЕДАКТИРОВАТЬ

После предложения shadownRanger для подхода к пониманию списка.

Я сравнил все 3 способа, чтобы увидеть, что быстрее.

import numpy as np
from datetime import datetime
# Randomly draw 100,000 integers between 1 and 100,000 as an example
index_list = np.random.randint(low=1, high=100000, size=100000)
# The data array being indexed
vals = np.linspace(1.,100000.,100000)

unique_index = np.unique(index_list)

time1 = datetime.now()
biggest = []
for line in unique_index:   
    biggest = np.append(biggest,max(vals[np.where(index_list == line)]))
time2 = datetime.now()
print ('time diff with for loop =', time2-time1)

time1 = datetime.now()
with_list_comprehension = [max(vals[np.where(index_list == x)]) for x in unique_index]
time2 = datetime.now()
print ('time diff with list comprehension =', time2-time1)

time1 = datetime.now()
lambda_way = list(map(lambda x : max(vals[np.where(index_list == x)]),unique_index))
time2 = datetime.now()
print ('time diff with map lambda =', time2-time1)

И результаты следующие.

time diff с for loop = 0:00: 05.194609

разница во времени с пониманием списка = 0: 00: 04.133024

разница во времени с лямбда-картой = 0: 00: 04.120000

...