矢量化计算 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()
我有一个聚合物,其坐标存储在 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()