<h3>纯粹的裸体切片之类的</h3>
<p>这一努力的重点是OP要求速度。这应该会有帮助。如果您有权访问像<code>numba</code>这样的JIT库,那么应该使用它并在每一行上循环。你知道吗</p>
<pre><code>sd = startday.start.values
ed = endday.end.values
dr = ed - sd + 1
i = np.arange(len(df)).repeat(dr)
j = np.concatenate([np.arange(s - 1, e) for s, e in zip(sd, ed)])
v = df.values
mx = np.empty(len(v), dtype=v.dtype)
mx.fill(v.min())
np.maximum.at(mx, i, v[i, j])
b = np.ones((v.shape[0], v.shape[1] + 2), bool)
b[i, j + 1] = (v[i, j] != mx[i]) | (mx[i] == 0)
x, y = np.where(b)
y_ = np.diff(y)
mask = y_ > 0
y__ = y_[mask]
x__ = x[1:][mask]
c = np.empty(len(v), int)
c.fill(y__.min())
np.maximum.at(c, x__, y__)
c - 1
array([2, 1, 3, 6, 1, 3, 0, 3, 1, 2])
</code></pre>
<hr/>
<h3>说明</h3>
<p>我不谈显而易见的事情。你知道吗</p>
<p>这表示每个间隔中的天数</p>
<pre><code>dr = ed - sd + 1
</code></pre>
<p><code>i</code>是<code>j</code>中对应的展平列索引的展平相关行索引</p>
<pre><code>i = np.arange(len(df)).repeat(dr)
j = np.concatenate([np.arange(s - 1, e) for s, e in zip(sd, ed)])
</code></pre>
<p><code>mx</code>将是每个间隔的最大值。你知道吗</p>
<p><code>b</code>将是一个布尔数组,其宽度比<code>v</code>宽2列。在这种情况下,它看起来像:</p>
<pre><code># Buffer Buffer
# / \ / \
array([[ True, True, True, False, False, True, False, True, True],
[ True, True, True, False, True, True, True, True, True],
[ True, False, False, False, True, False, False, True, True],
[ True, True, False, False, False, False, False, False, True],
[ True, True, False, True, True, True, False, True, True],
[ True, False, False, True, True, False, False, False, True],
[ True, False, False, False, False, False, False, False, True],
[ True, True, True, True, False, False, False, True, True],
[ True, True, True, False, True, True, True, False, True],
[ True, True, False, False, True, True, True, True, True]])
</code></pre>
<p>使用缓冲列的原因是我可以在使用<code>np.where</code>之后计算位置的差异</p>
<p>现在我填充<code>b</code>,其中<code>v</code>值不等于<code>mx</code>中的最大值</p>
<pre><code> # not equal to max is equal to zero
b[i, j + 1] = (v[i, j] != mx[i]) | (mx[i] == 0)
</code></pre>
<p>然后我找到这些位置在<code>y</code>中的位置。你知道吗</p>
<p>通过使用<code>diff</code>,我找到了从一个不等于max的实例到下一个不等于max的实例的位置数。这总是比我们要查找的数字大一个,但我们稍后会更正它。你知道吗</p>
<p>另外,<code>diff</code>会将长度减少1,但实际上,有很多东西我们不需要,因为我不需要计算一行相对于前一行的差值。幸运的是,我可以消除所有零或负的差异,因为它们没有意义。你知道吗</p>
<p>我再次使用了<code>np.maximum.at</code>,但是这次是在差异上找到最大的差异,这将是每行连续最大值的最长长度。你知道吗</p>
<p>请注意,实际上还有一个</p>
<p>呸。我厌倦了打字。。。你知道吗</p>