Я пытаюсь перебрать массив np.ar с нетривиальной функцией, принимая n-элемент массива и некоторые другие параметры.Тем не менее, я заметил, что до сих пор самый эффективный способ - это использовать понимание списков, есть ли другой более быстрый способ сделать это?функция «map», кажется, не работает быстрее, и я не могу поверить, что явное зацикливание является самым быстрым способом ... Ниже приведен некоторый тестовый код и игрушечные данные.
import numpy as np
from sklearn.neighbors import NearestNeighbors
from functools import partial
input_data = np.array([[207843.5, 468331.5],
[209827.5, 469081.5],
[209572.5, 468870.5],
[209327.5, 468720.5],
[207722.5, 468209.5]])
coordinates = np.array([
[194072.430, 440034.24 ],
[194172.74 , 440054.48 ],
[209828.5, 469083.5],
[194166.670, 440062.43 ],
[194163.64 , 440066.4 ],
[209327.5, 468720.5],
[194145.431, 440090.24 ],
[194195.43, 440092.24 ]])
nbrs = NearestNeighbors(n_neighbors=1,
algorithm='ball_tree', leaf_size = 15).fit(coordinates)
def fun(measure,
nbrs,
coordinates
):
distances, indices = nbrs.kneighbors(measure.reshape(1,-1))
idx_closest = indices[0,0]
idx_right = idx_closest + 1
idx_left = idx_closest - 1
lowest, highest = coordinates[idx_left], coordinates[idx_right]
return lowest , highest
# 2.01 ms
%timeit [fun(measure,nbrs, coordinates) for measure in input_data]