擅长:python、mysql、java
<p>首先制作一个掩码来跟踪要保留的行,并转换数字列:</p>
<pre><code>keep = np.ones(len(arr), bool) # [True, True, True]
numer = arr[:,3].astype(float)
denom = arr[:,4].astype(float)
</code></pre>
<p>然后循环编辑要保留的行的掩码:</p>
<pre><code>for ii in range(1, len(arr)):
if np.all(arr[ii-1,:3] == arr[ii,:3]):
if numer[ii-1] / denom[ii-1] < numer[ii] / denom[ii]:
keep[ii-i] = False
else:
keep[ii] = False
</code></pre>
<p>现在您有了<code>keep</code>作为<code>array([ True, False, True])</code>,您可以很容易地使用它来获得最终结果:</p>
<pre><code>arr[keep]
</code></pre>
<p>给你:</p>
<pre><code>array([['ID32', 'TRED', 'PLUS', '434', '0.34', '11.9', '4.8'],
['ID32', 'PROP', 'MINUS', '234', '0.56', '44.3', '1.11']],
dtype='<U14')
</code></pre>
<p>如果匹配字符串的数量与行总数相比较小,则这可能会更快:</p>
<pre><code>matches = 1 + np.where((xxx[1:] == xxx[:-1]).all(1))[0] # [1]
for ii in matches: # now we already know the strings match
if numer[ii-1] / denom[ii-1] < numer[ii] / denom[ii]:
keep[ii-i] = False
else:
keep[ii] = False
</code></pre>
<p>这样代码仍然是可读的,但是循环只是迭代匹配的数量,而不是行的数量</p>