<p>此解决方案还使用KDTrees(来自scipy库)。你知道吗</p>
<p>在您的代码和前面的答案中,当循环计算radius=3的结果时,它将重复radius=0,1,
和2。你知道吗</p>
<p>下面的代码一次通过节点就完成了所有的计算。定义一个最大距离和一个范围箱数。找到具有最大距离的所有节点对,并使用<code>np.digitize()</code>将实际距离映射到范围bin。将“val”添加到映射的范围bin。你知道吗</p>
<pre><code>import pandas as pd
import numpy as np
from scipy.spatial import cKDTree as KDTree
# define the range and number of range bins
# this example defines 3 bins: 0.0 - 1.0; 1.0 - 2.0; 2.0 - 3.0
max_distance = 3.0
nbins = 3
bin_range = 0.0, max_distance
bins = np.linspace(*bin_range, nbins+1)[1:]
# build a KDTree and generate a sparse matrix of node pairs
# that have a max distance of bin_range[-1]
tree = KDTree(df[['x','y','z']])
dist = tree.sparse_distance_matrix(tree, bin_range[-1])
# one row per node, one column per range bin
sums = np.zeros((len(df), nbins))
# for each pair of nodes, map the range to the bin index and add
# the value of the second node to mapped bin for the 1st node
for (j,k),d in dist.items():
sums[j][np.digitize(d, bins)] += df['val'][k+1]
</code></pre>
<p>对于每个节点,数组<code>sums</code>都包含一行,其中包含了装箱范围的和。例如,第一列包含距离为<;1的节点的VAL之和,第二列包含距离在1和2之间的节点的VAL,第三列包含距离在2和3之间的节点的VAL。您可以跨列累加以获得与表相同的结果。你知道吗</p>
<pre><code>sums
array([[ 0., 1., 21.],
[ 0., 0., 25.],
[ 0., 6., 11.],
[ 1., 10., 43.],
[ 0., 19., 51.],
[ 0., 17., 40.],
[ 6., 0., 25.],
[ 3., 22., 49.],
[ 7., 47., 45.],
[11., 35., 65.],
[ 0., 31., 42.],
[ 0., 10., 23.],
[14., 48., 37.],
[18., 77., 10.],
[10., 50., 47.],
[ 4., 12., 50.],
[20., 47., 33.],
[15., 50., 36.],
[ 2., 29., 49.]])
</code></pre>