<pre><code>for i in range(0, n):
for j in range(i+1, n):
c[i, j] = math.sqrt((ncoord[i, 0] - ncoord[j, 0])**2
+ (ncoord[i, 1] - ncoord[j, 1])**2)
</code></pre>
<p><strong>注意:<code>ncoord[i, j]</code>与<code>ncoord[i][j]</code>对于Numpy<em>矩阵</em>不同。这似乎是混乱的根源。如果<code>ncoord</code>是一个Numpy<em>数组,那么它们将给出相同的结果。</p>
<p>对于Numpy<em>matrix</em>,<code>ncoord[i]</code>返回<code>ncoord</code>的第</em>行的<em>,它本身是一个Numpy<em>matrix</em>对象,在您的例子中是1 x 2形状。因此,<code>ncoord[i][j]</code>实际上是指:取<code>ncoord</code><em>的第i行</em>和</em>取1×2<em>矩阵</em>的第j行</em>。这就是索引问题在<code>j</code>>;0时出现的地方。</p>
<p>关于您对分配给<code>c[i][j]</code>“工作”的评论,应该不会。至少在我的Numpy 1.9.1版本中,如果您的索引<code>i</code>和<code>j</code>迭代到<code>n</code>时,应该不会工作。</p>
<p>作为旁白,请记住将矩阵<code>c</code>的转置相加。</p>
<p>建议使用Numpy数组而不是矩阵。见<a href="https://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-i-u">this post</a>。</p>
<p>如果坐标存储为Numpy数组,则成对距离可以计算为:</p>
<pre><code>from scipy.spatial.distance import pdist
pairwise_distances = pdist(ncoord, metric="euclidean", p=2)
</code></pre>
<p>或者只是</p>
<pre><code>pairwise_distances = pdist(ncoord)
</code></pre>
<p>因为默认度量是“euclidean”,而默认度量“p”是2。</p>
<p>在下面的评论中,我错误地提到pdist的结果是n x n矩阵。
要得到n x n矩阵,需要执行以下操作:</p>
<pre><code>from scipy.spatial.distance import pdist, squareform
pairwise_distances = squareform(pdist(ncoord))
</code></pre>
<p>或者</p>
<pre><code>from scipy.spatial.distance import cdist
pairwise_distances = cdist(ncoord, ncoord)
</code></pre>