<p>我认为您可以使用原始的<code>vfunc</code>,而不需要嵌套它。<code>vectorize</code>需要一个接受标量的函数。它根据需要广播输入以将标量集传递给函数。你知道吗</p>
<p>是标量输入干扰了第二级矢量化。你知道吗</p>
<p>但是看看我们能用第一个矢量化做些什么:</p>
<pre><code>In [389]: def getDistanceBetween2Movies(movie1, movie2):
...: return np.linalg.norm(X[movie1]-X[movie2])
...:
In [390]: X = np.arange(20)
</code></pre>
<p>你的函数值有两个标量:</p>
<pre><code>In [391]: getDistanceBetween2Movies(1,2)
Out[391]: 1.0
In [393]: getDistanceBetween2Movies(1,10)
Out[393]: 9.0
In [394]: vfunc = np.vectorize(getDistanceBetween2Movies)
</code></pre>
<p><code>vectorize</code>对于标量和数组,实际上<code>[getDistanceBetween2Movies(i,j) for j in movielist]</code>:</p>
<pre><code>In [395]: vfunc(1,np.arange(5))
Out[395]: array([ 1., 0., 1., 2., 3.])
</code></pre>
<p>但我可以给它两个数组,一个是列向量。这最终会进行类似<code>outer</code>的评估:</p>
<pre><code>In [396]: vfunc(np.arange(5)[:,None], np.arange(5))
Out[396]:
array([[ 0., 1., 2., 3., 4.],
[ 1., 0., 1., 2., 3.],
[ 2., 1., 0., 1., 2.],
[ 3., 2., 1., 0., 1.],
[ 4., 3., 2., 1., 0.]])
</code></pre>
<p>将该输出与这两个数组之间的简单广播差异进行比较:</p>
<pre><code>In [397]: np.arange(5)[:,None]-np.arange(5)
Out[397]:
array([[ 0, -1, -2, -3, -4],
[ 1, 0, -1, -2, -3],
[ 2, 1, 0, -1, -2],
[ 3, 2, 1, 0, -1],
[ 4, 3, 2, 1, 0]])
</code></pre>
<p><code>vectorize</code>并不能提高直接迭代的速度,但它可以使复杂标量函数的计算变得更容易,特别是当需要相互广播的多个输入时。你知道吗</p>
<p>正如@Nils所示,您可能不需要使用<code>vectorize</code>。你知道吗</p>