Более эффективный способ вычисления расстояний между массивами Numpy? - PullRequest
0 голосов
/ 05 мая 2018

Что у меня есть: заранее определенные круги в разных местах в 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. Мне интересно, есть ли способ более эффективно выполнять эту работу.

...