矢量化计算 numpy 中的流体动力学半径

Vectorizing calculating the hydrodynamic radius in numpy

我有一个聚合物,其坐标存储在 Nx3 numpy 数组中,其中 N 是聚合物中的粒子数(聚合度)。

我正在尝试计算这种聚合物的流体力学半径。流体动力学半径由 this link 中的第一个表达式给出。流体动力学半径 Rh 本质上是成对距离的调和平均值。

鉴于 P 是 Nx3 数组,这是我当前的 numpy-pythonic 实现:

inv_dist = 0
for i in range(N-1):
    for j in range(i+1, N): 
        inv_dist += 1/(np.linalg.norm (P[i,:]-P[j,:], 2))


Rh = 1/(inv_dist/(N**2) )

np 在这种情况下是 numpy。我知道维基百科公式要求整体平均值。这意味着我将在我的模拟中遍历聚合物的每一种可能配置。无论如何,上面提到的两个循环仍然会被计算。

这是一个 Nx(N-1)/2 次迭代的嵌套 for 循环。随着 N 变大,这种计算变得越来越费力。我如何矢量化此代码以在一定程度上绕过 for 循环?

如果您能给我任何建议,我将不胜感激。

您可以使用 scipy.spatial.distance.pdist:

from scipy.spatial.distance import pdist

inv_dist = (1/pdist(P)).sum()