<p>作为一种方法,我们可以得到非零指数,并得到这些指数的平均值作为质心,如下-</p>
<pre><code>np.flatnonzero(x).mean()
</code></pre>
<p>这是另一种方法,使用移位数组比较来获得该切片的开始和停止索引,并获得这些索引的平均值,以确定质心,如下-</p>
^{pr2}$
<p>运行时测试-</p>
<pre><code>In [72]: x = np.zeros(10000,dtype=int)
In [73]: x[100:2000] = 1
In [74]: %timeit np.flatnonzero(x).mean()
10000 loops, best of 3: 115 µs per loop
In [75]: %timeit np.flatnonzero(x[:-1] != x[1:]).mean()+0.5
10000 loops, best of 3: 38.7 µs per loop
</code></pre>
<p>使用<code>np.nonzero()[0]</code>代替<code>np.flatnonzero</code>和{<cd3>}代替{<cd4>}-</p>
<pre><code>In [107]: %timeit (np.nonzero(x[:-1] != x[1:])[0].sum()+1)/2.0
10000 loops, best of 3: 30.6 µs per loop
</code></pre>
<p>或者,对于第二种方法,我们可以存储启动和停止索引,然后简单地将它们相加以获得更有效方法的重心,因为我们可以避免对<code>np.mean</code>的函数调用,如-</p>
<pre><code>start,stop = np.flatnonzero(x[:-1] != x[1:])
out = (stop + start + 1)/2.0
</code></pre>
<p>时间安排-</p>
<pre><code>In [90]: %timeit start,stop = np.flatnonzero(x[:-1] != x[1:])
10000 loops, best of 3: 21.3 µs per loop
In [91]: %timeit (stop + start + 1)/2.0
100000 loops, best of 3: 4.45 µs per loop
</code></pre>
<p>同样,我们可以在这里用<code>np.nonzero()[0]</code>进行实验。在</p>