擅长:python、mysql、java
<p>可能的矢量化解决方案如下</p>
<pre><code>idx_1s, = np.where(x == -1) # find the positions of the -1's
idx1s, = np.where(x == 1) # find the positions of the 1's
</code></pre>
<p>要找到哪些1应该变成0,并标记1块的开始:</p>
^{pr2}$
<p>现在我们有两个长度相等的数组,<code>idx0s</code>和<code>idx_1s</code>,标记每个块的第一项和最后一项的位置,因此我们现在可以:</p>
<pre><code>y = x.copy()
y[idx0s] = 0
idx0s += 1
idx_1s += 1
mask = np.zeros_like(y, dtype=np.bool)
mask[idx0s] = True
mask[idx_1s] = True
mask = np.logical_xor.accumulate(mask)
y[mask] = 1
</code></pre>
<p>从而产生所需的:</p>
<pre><code>>>> y
array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0])
</code></pre>
<p>对于格式错误的输入,它可能有点脆弱,而且我认为它不能优雅地处理尾部-1。但是唯一的非O(n)操作是对searchsorted的调用,但是<code>searchsorted</code>进行了优化,可以更快地搜索已排序的键,因此它可能不会很明显。在</p>
<p>如果我在你的<code>x</code>上计算时间,它不会超过循环版本,但对于更大的数组,它可能会。在</p>