Что у меня есть: заранее определенные круги в разных местах в 3D-окне и частицы (с идентификаторами и местоположениями в координатах x-y-z).
Что я хочу сделать: выяснить все частицы в пределах определенного радиуса каждого круга и записать их идентификаторы.
Что я делал: я использую функцию distance.cdist () для вычисления евклидовых расстояний между позициями оси x всех частиц и каждого центра окружностей. Это делается путем зацикливания на всех центрах и сохранения расстояний между всеми частицами и каждым центром в разных столбцах.
Мой код:
p_h_dx = np.empty((len(p),len(dsel))) #I create an empty array
for i in range(len(dsel)): #looping over all centers
distance = distance.cdist(np.column_stack((p[:,1],p_zeros)),np.column_stack((dsel[:,2][i],0)),'euclidean')
p_h_dx[:,i] = distance.reshape((len(p),))[:]
Затем я повторяю это для оси y и оси z. В итоге я рассчитываю расстояния следующим образом:
###############################################
p_h_dx an array storing the distances between the x-axis positions of all
particles and centers of the circles;
p_h_dy for y-axis and p_h_dz for z-axis
###############################################
p_h_d = np.sqrt(np.power(p_h_dx,2) + np.power(p_h_dy,2) + np.power(p_h_dz,2))
У меня более 100 миллионов частиц и ~ 30 тысяч кругов, поэтому при моем текущем методе для достижения моей цели требуется ~ 1 неделя, даже с использованием mpi. Мне интересно, есть ли способ более эффективно выполнять эту работу.