Ускорьте поиск лучших индексовPython

Программы на Python
Ответить
Anonymous
 Ускорьте поиск лучших индексов

Сообщение Anonymous »

У меня есть массив numpy, который сопоставляет координаты xy с соответствующими координатами z. Для этого я использую 2D-массив, который представляет оси x и y и содержит соответствующие значения z:

Код: Выделить всё

import numpy as np
x_size = 2000
y_size = 2500
z_size = 400
rng = np.random.default_rng(123)
z_coordinates = np.linspace(0, z_size, y_size) + rng.laplace(0, 1, (x_size, y_size))
Таким образом, каждой из 2000*2500 точек xy присваивается значение z (плавающее значение от 0 до 400). Теперь я хочу найти каждое целое число z и целое число x, которое является ближайшим значением y, по сути создавая карту, имеющую форму (x_size, z_size) и содержащую лучшие значения y.
Самый простой подход — создать пустой массив целевой формы и выполнить итерацию по каждому значению z:

Код: Выделить всё

y_coordinates = np.empty((x_size, z_size), dtype=np.uint16)
for i in range(z_size):
y_coordinates[:, i] = np.argmin(
np.abs(z_coordinates - i),
axis=1,
)
Однако на моей машине это занимает около 11 секунд, что, к сожалению, очень медленно.
Конечно, использование более векторизованного подхода было бы быстрее, например как:

Код: Выделить всё

y_coordinates = np.argmin(
np.abs(
z_coordinates[..., np.newaxis] - np.arange(z_size)
),
axis=1,
)
Неожиданно это работает примерно на 60 % медленнее, чем версия выше (проверено при размере 1/10, поскольку в полном размере используется слишком много памяти).
Также обертывание блоков кода в функции и украшение их @jit(nopython=True) numba не помогает.
Как я могу ускорить работу расчет?

Подробнее здесь: https://stackoverflow.com/questions/792 ... st-indices
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»