Найти попарные различия строк массива numpy (с пердиическими границами) ⇐ Python
-
Гость
Найти попарные различия строк массива numpy (с пердиическими границами)
У меня есть (N,3)-мерный массив numpy, содержащий 3-dim. положения N частиц в его рядах. Я хочу получить попарные расстояния этих частиц, используя периодические границы (последнее означает, что если частицы имеют расстояние d по x, y или z, превышающее значение L/2, то мы берем расстояние abs( d-L), а не сам d).
Мой прототип в стиле C выглядит так:
def get_distances(positions, L): """Вычисление расстояний от позиций с использованием периодических границ""" рс = [] L_половина = 0,5*L для pos_i в позициях: для pos_j в позициях: rx = np.abs(pos_i[0] - pos_j[0]) rx = rx, если rx < L_half, иначе np.abs(rx-L) ry = np.abs(pos_i[1] - pos_j[1]) ry = ry, если ry < L_half иначе np.abs(ry-L) rz = np.abs(pos_i[2] - pos_j[2]) rz = rz, если rz < L_half, иначе np.abs(rz-L) rs += [np.sqrt(rx*rx + ry*ry + rz*rz)] вернуть рупий Как я могу сделать это более эффективным и Pythonic?
У меня есть (N,3)-мерный массив numpy, содержащий 3-dim. положения N частиц в его рядах. Я хочу получить попарные расстояния этих частиц, используя периодические границы (последнее означает, что если частицы имеют расстояние d по x, y или z, превышающее значение L/2, то мы берем расстояние abs( d-L), а не сам d).
Мой прототип в стиле C выглядит так:
def get_distances(positions, L): """Вычисление расстояний от позиций с использованием периодических границ""" рс = [] L_половина = 0,5*L для pos_i в позициях: для pos_j в позициях: rx = np.abs(pos_i[0] - pos_j[0]) rx = rx, если rx < L_half, иначе np.abs(rx-L) ry = np.abs(pos_i[1] - pos_j[1]) ry = ry, если ry < L_half иначе np.abs(ry-L) rz = np.abs(pos_i[2] - pos_j[2]) rz = rz, если rz < L_half, иначе np.abs(rz-L) rs += [np.sqrt(rx*rx + ry*ry + rz*rz)] вернуть рупий Как я могу сделать это более эффективным и Pythonic?