擅长:python、mysql、java
<p>在担心多核之前,我将使用字典消除ismember函数中的线性扫描:</p>
<pre><code>def ismember(a, b):
bind = {}
for i, elt in enumerate(b):
if elt not in bind:
bind[elt] = i
return [bind.get(itm, None) for itm in a] # None can be replaced by any other "not in b" value
</code></pre>
<p>原始实现要求对a中的每个元素对B中的元素进行完全扫描,使其成为<code>O(len(A)*len(B))</code>。上述代码需要对B进行一次完整扫描才能生成dict Bset。通过使用dict,可以有效地查找a的每个元素的B常量中的每个元素,从而执行操作<code>O(len(A)+len(B))</code>。如果这仍然太慢,那么请担心使上述函数在多个内核上运行。</p>
<p>编辑:我也稍微修改了你的索引。Matlab使用0,因为它的所有数组都从索引1开始。Python/numpy从0开始数组,所以如果数据集是这样的</p>
<pre><code>A = [2378, 2378, 2378, 2378]
B = [2378, 2379]
</code></pre>
<p>如果返回0表示没有元素,那么结果将排除A的所有元素。上面的例程返回<code>None</code>表示没有索引,而不是0。返回-1是一个选项,但Python会将其解释为数组中的最后一个元素。<code>None</code>如果用作数组的索引,则将引发异常。如果需要不同的行为,请将<code>Bind.get(item,None)</code>表达式中的第二个参数更改为要返回的值。</p>