<p>我们可以将所有<em>子列表</em>中的元素展平,得到1D数组。然后,我们只需在平坦1D数组中的每个<em>子列表</em>的限制内查找<code>'c'</code>。因此,基于这种理念,我们可以使用两种方法,基于我们如何计算任何<code>c</code>的发生率。你知道吗</p>
<p><strong>方法#1:</strong>一种方法<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html" rel="nofollow noreferrer">^{<cd3>}</a>-</p>
<pre><code>lens = np.array([len(i) for i in nested_list])
arr = np.concatenate(nested_list)
ids = np.repeat(np.arange(lens.size),lens)
out = np.bincount(ids, arr=='c')!=0
</code></pre>
<p>因为,如问题中所述,<code>nested_list</code>不会在迭代过程中改变,所以我们可以重用所有东西,只循环到最后一步。你知道吗</p>
<hr/>
<p><strong>方法#2:</strong>另一种方法<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.reduceat.html" rel="nofollow noreferrer">^{<cd5>}</a>重用前一种方法的<code>arr</code>和<code>lens</code></p>
<pre><code>grp_idx = np.append(0,lens[:-1].cumsum())
out = np.add.reduceat(arr=='c', grp_idx)!=0
</code></pre>
<p>在循环遍历<code>words</code>列表时,我们可以通过沿轴使用<code>np.add.reduceat</code>并使用<code>broadcasting</code>给我们一个<code>2D</code>数组布尔值来保持这种方法在最后一步的矢量化,就像这样-</p>
<pre><code>np.add.reduceat(arr==np.array(words)[:,None], grp_idx, axis=1)!=0
</code></pre>
<p>样本运行-</p>
<pre><code>In [344]: nested_list
Out[344]: [['a', 'b', 'c'], ['a', 'b'], ['b', 'c'], ['c']]
In [345]: words
Out[345]: ['c', 'b']
In [346]: lens = np.array([len(i) for i in nested_list])
...: arr = np.concatenate(nested_list)
...: grp_idx = np.append(0,lens[:-1].cumsum())
...:
In [347]: np.add.reduceat(arr==np.array(words)[:,None], grp_idx, axis=1)!=0
Out[347]:
array([[ True, False, True, True], # matches for 'c'
[ True, True, True, False]]) # matches for 'b'
</code></pre>