<p><a href="https://numpy.org/doc/stable/reference/generated/numpy.unique.html" rel="nofollow noreferrer">^{<cd1>}</a>如果指定<code>return_index=True</code>,则返回每个数字的第一个索引。您可以很容易地使用<a href="https://numpy.org/doc/stable/reference/generated/numpy.isin.html" rel="nofollow noreferrer">^{<cd3>}</a>过滤结果,例如:</p>
<pre><code>u, i = np.unique(vec, return_index=True)
result = i[np.isin(u, [51, 52], invert=True)]
</code></pre>
<p>这样做的好处是<code>u</code>与原始数据相比,大大减少了搜索空间。与显式否定生成的掩码相比,使用<code>invert=True</code>也会稍微加快速度</p>
<p>依赖于数据已排序这一事实的<code>np.isin</code>版本可以使用<a href="https://numpy.org/doc/stable/reference/generated/numpy.searchsorted.html" rel="nofollow noreferrer">^{<cd7>}</a>如下所示:</p>
<pre><code>def isin_sorted(a, i, invert=False):
ind = np.searchsorted(a, i)
ind = ind[a[ind.clip(max=a.size)] == i]
if invert:
mask = np.ones(a.size, dtype=bool)
mask[ind] = False
else:
mask = np.zeros(a.size, dtype=bool)
mask[ind] = True
return mask
</code></pre>
<p>在调用<code>np.unique</code>之后,您可以使用此版本来代替<code>np.isin</code>,它总是返回一个排序数组。对于足够大的<code>vec</code>和排除列表,它将更有效:</p>
<pre><code>result = i[isin_sorted(u, [51, 52], invert=True)]
</code></pre>