我刚刚注意到被接受的答案不起作用。例如,这种情况:
a = 1-np.random.random(20)*0.05
<20 uniformly chosen values between 0.95 and 1.0>
np.sort(a)
>>>> array([ 0.9514548 , 0.95172218, 0.95454535, 0.95482343, 0.95599525,
0.95997008, 0.96385762, 0.96679186, 0.96873524, 0.97016127,
0.97377579, 0.98407259, 0.98490461, 0.98964753, 0.9896733 ,
0.99199411, 0.99261766, 0.99317258, 0.99420183, 0.99730928])
TOL = 0.01
结果为:
a.flat[i[d>TOL]]
>>>> array([], dtype=float64)
由于排序后的输入数组中没有任何值足够间隔至少“TOL”,因此正确的结果应该是:
>>>> array([ 0.9514548, 0.96385762, 0.97016127, 0.98407259,
0.99199411])
虽然这取决于你如何在“TOL”中选择数值,但你需要使用整数不受机器精度影响的事实:
np.unique(np.floor(a/TOL).astype(int))*TOL
>>>> array([ 0.95, 0.96, 0.97, 0.98, 0.99])
根据 %timeit 的测试结果,该解决方案的性能比建议的解决方案快了 5 倍。
请注意,“.astype(int)” 是可选的,但是如果删除它,则性能会恶化 1.5 倍,因为从 int 数组中提取唯一值要快得多。
您可能希望将“TOL”的一半添加到唯一值的结果中,以补偿向下取整效应:
(np.unique(np.floor(a/TOL).astype(int))+0.5)*TOL
>>>> array([ 0.955, 0.965, 0.975, 0.985, 0.995])
np.unique
调用中添加axis=0
。谢谢! - rayryeng