<p>这相当慢,但不会创建大的中间矩阵。在</p>
<pre><code>vals = np.zeros(N)
for i in xrange(N):
u = nhat[i]
for v in m:
vals[i]+=abs(np.dot(u,v))
vals[i]=vals[i]/M
</code></pre>
<p>编辑:在for循环外移动除以M。在</p>
<p>第二版:新观念、旧观念及相关评论。在</p>
^{pr2}$
<p>这很快,但有时会给出不同的值,我正在研究原因,但同时可能会有所帮助。在</p>
<p>编辑3:啊,这是绝对值的东西。嗯</p>
<pre><code>>>> S
array([ 0.28620962, 0.65337876, 0.37470707, 0.46500913, 0.49579837,
0.29348924, 0.27444208, 0.74586928, 0.35789315, 0.3079964 ,
0.298353 , 0.42571445, 0.32535728, 0.87505053, 0.25547394,
0.23964505, 0.44773271, 0.25235646, 0.4722281 , 0.33003338])
>>> vals
array([ 0.2099343 , 0.6532155 , 0.33039334, 0.45366889, 0.48921527,
0.20467291, 0.16585856, 0.74586928, 0.31234917, 0.22198642,
0.21013519, 0.41422894, 0.26020981, 0.87505053, 0.1199069 ,
0.06542492, 0.44145805, 0.08455833, 0.46824704, 0.28483342])
time to compute S: 0.000342130661011 seconds
time to compute vals: 7.29560852051e-05 seconds
</code></pre>
<p>编辑4:好吧,如果你的单位向量大部分都是正值,这应该运行得更快,假设m中的向量总是正数,就像它们在你的虚拟数据中一样。在</p>
<pre><code>m2 = np.average(m,0)
vals = np.zeros(N)
for i in xrange(N):
u=nhat[i]
if u[0] >= 0 and u[1] >= 0 and u[2] >= 0:
vals[i] = abs(np.dot(u,m2))
else:
for j in xrange(M):
vals[i]+=abs(np.dot(u,m[j]))
vals[i]/=M
</code></pre>