擅长:python、mysql、java
<p>我认为最根本的问题是你在浮点数上使用了类似集合的操作——这是作为一个<em>一般</em>规则应该避免的,除非你有很好的理由和对浮点数的深刻理解。</p>
<p>遵循这一规则的明显原因是,即使两个浮点寄存器之间的一个非常小的差异也是绝对差异,因此数值错误可能会导致类集合操作产生意外的结果。现在,在您的用例中,最初您似乎已经通过先舍入来避免了这个问题,从而限制了可能值的范围。但事实证明,意外的结果仍然是可能的,正如这个角落的案例所显示的那样。浮点数很难解释。</p>
<p>我认为正确的解决方法是使用<code>astype</code>将其舍入并<em>然后</em>转换为<code>int</code>。</p>
<pre><code>>>> a
array([-0.5, 2. , 0.2, -3. , -0.2])
>>> numpy.fix(a)
array([-0., 2., 0., -3., -0.])
>>> numpy.fix(a).astype(int) # could also use 'i8', etc...
array([ 0, 2, 0, -3, 0])
</code></pre>
<p>因为您已经进行了舍入,所以这不应该丢弃任何信息,而且对于以后的set-like操作,它将更加稳定和可预测。这是最好使用正确抽象的情况之一!</p>
<p>如果你需要浮动,你总是可以转换回来。唯一的问题是它创建了另一个副本;但大多数情况下这并不是一个真正的问题。<code>numpy</code>足够快,复制的开销非常小!</p>
<p>我要补充的是,如果你的案例确实需要使用float,那么<a href="https://stackoverflow.com/a/26786119/577088">tom10</a>的答案是一个很好的答案。但我觉得,无论是浮动操作还是集合式操作都是真正必要的情况非常少。</p>