擅长:python、mysql、java
<p>由于您正在计算矩阵行之间的差异,因此我们尝试将以下双for循环矢量化</p>
<pre><code>a = numpy.arange(25).reshape(5, 5)
y = numpy.zeros(5, 5)
for i in range(len(a)):
for j in range(len(a)):
y[i, j] = numpy.linalg.norm(a[i, :] - a[j, :])
</code></pre>
<p>第一步是将行差异矢量化</p>
<pre><code>a[i, :] - a[j, :] # difference between rows `i` and `j`
</code></pre>
<p>通过计算矩阵行的“外差”,得到一个三维张量:</p>
<pre><code>x = a[:, None, :] - a[None, :, :]
x.shape # (5, 5, 5)
</code></pre>
<p>之后,在张量的相应位置可以发现<code>i</code>行和<code>j</code>行的差异:</p>
<pre><code>x[i, j, :] # difference between rows `i` and `j`
</code></pre>
<p>循环就变成了</p>
<pre><code>for i in range(len(a)):
for j in range(len(a)):
y[i, j] = numpy.linalg.norm(x[i, j, :])
</code></pre>
<p>然而,由于我们现在只在<code>x</code>的前两个轴上迭代,我们可以用对<code>numpy.linalg.norm()</code>的向量化调用来替代双循环:</p>
<pre><code>y = numpy.linalg.norm(x, axis=-1)
</code></pre>
<p>并在相应位置再次得到行<code>i</code>和<code>j</code>的距离</p>
<pre><code>y[i, j] # distance between rows `i` and `j`
</code></pre>