<p>下面是一个<code>vectorized</code>解决方案,使用布尔掩码索引<code>array_2d</code>:</p>
<pre><code>array_2d = np.array([[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]])
array_len = [6,5,3]
m = ~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
array_2d[m]
array([ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 21, 22, 21])
</code></pre>
<p><b>详细信息</b></p>
<p>创建掩码时将<a href="https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.cumsum.html" rel="nofollow noreferrer">^{<cd3>}</a>放在与<code>array_2d</code>形状相同的<a href="https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ones.html" rel="nofollow noreferrer">^{<cd4>}</a>上,并执行行比较以查看哪些元素大于<code>array_len</code>。在</p>
<p>因此,第一步是创建以下<code>ndarray</code>:</p>
^{pr2}$
<p>并与<code>array_len</code>执行行比较:</p>
<pre><code>~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
array([[ True, True, True, True, True, True],
[ True, True, True, True, True, False],
[ True, True, True, False, False, False]])
</code></pre>
<p>然后您只需使用以下内容筛选数组:</p>
<pre><code>array_2d[m]
array([ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 21, 22, 21])
</code></pre>