我的目标是在模拟中为所有粒子创建一个粒子与每个其他粒子之间的角度的 nxn 数组。然后掩膜阵列可以选择特定视野中的所有粒子。
我的问题是如何逐行获取两个 nxn 数组(dx/距离和 dy/距离),并使用一行 nx2 向量的点积来生成一个粒子和每个其他粒子之间的 nx1 角度数组。对所有行重复此操作,并生成所有角度的 nxn 数组。
上下文 - 有 n 个位置 (x, y) 和速度 (x, y) 的粒子。每个粒子之间的偏移向量可以通过创建一个 nxn 数组 dx 和 nxn 数组 dy 来计算。偏移向量(从粒子 i 到粒子 j)是 (xi - xj, yi - yj),我们可以从 (dx, dy) 得到。创建单位向量分量 dx/distance 和 dy/distance。
n = 4
k = 10
width = 50
boid_radius = 8
dim = 2
position = np.random.rand(n, dim) * width # random dataset
velocity = 0.5 * np.random.random_sample((n, dim)) + 1
from sklearn import preprocessing as pp
velocity_normalized = pp.normalize(velocity)
dx = np.subtract.outer(position[:, 0], position[:, 0])
dy = np.subtract.outer(position[:, 1], position[:, 1])
distance = np.hypot(dx, dy)
# mask zeros
ox = dx/distance
ox = dy/distance
示例数据:
position
Out[233]:
array([[ 6.68625116, 34.35642605],
[ 18.96766714, 45.61291941],
[ 49.49921981, 37.95450382],
[ 28.22272906, 42.90652135]])
dx
Out[234]:
array([[ 0. , -12.28141597, -42.81296865, -21.5364779 ],
[ 12.28141597, 0. , -30.53155268, -9.25506192],
[ 42.81296865, 30.53155268, 0. , 21.27649075],
[ 21.5364779 , 9.25506192, -21.27649075, 0. ]])
dy
Out[235]:
array([[ 0. , -11.25649336, -3.59807777, -8.5500953 ],
[ 11.25649336, 0. , 7.65841559, 2.70639806],
[ 3.59807777, -7.65841559, 0. , -4.95201753],
[ 8.5500953 , -2.70639806, 4.95201753, 0. ]])
形成偏移单位矢量分量:
distance = np.hypot(dx, dy).round()
array([[ 0., 17., 43., 23.],
[ 17., 0., 31., 10.],
[ 43., 31., 0., 22.],
[ 23., 10., 22., 0.]])
zeros = ma.masked_where(distance==0, distance)
masked_array(data =
[[-- 17.0 43.0 23.0]
[17.0 -- 31.0 10.0]
[43.0 31.0 -- 22.0]
[23.0 10.0 22.0 --]],
mask =
[[ True False False False]
[False True False False]
[False False True False]
[False False False True]],
fill_value = 1e+20)
ox = dx / zeros
masked_array(data =
[[-- -0.7224362336046727 -0.9956504337130146 -0.9363686041759272]
[0.7224362336046727 -- -0.9848887960767806 -0.9255061924766889]
[0.9956504337130146 0.9848887960767806 -- 0.9671132160733322]
[0.9363686041759272 0.9255061924766889 -0.9671132160733322 --]],
mask =
[[ True False False False]
[False True False False]
[False False True False]
[False False False True]],
fill_value = 1e+20)
下一步是在单位速度矢量和单位偏移矢量之间进行点积。这就是我卡住的地方。
velocity
Out[239]:
array([[ 1.08980931, 1.10142992],
[ 1.42378512, 1.31445528],
[ 1.4599431 , 1.34567875],
[ 1.45934809, 1.03997269]])
pp.normalize(velocity)
Out[242]:
array([[ 0.70334695, 0.71084672],
[ 0.73475404, 0.67833363],
[ 0.73529551, 0.67774665],
[ 0.81437139, 0.58034407]])
下一步?我不知道如何对向量进行索引,以使 numpy 看起来像魔术一样完成所有工作。