NumPy に浮動小数点値の配列がありndarray
、この配列の一意の値を見つけたいと考えています。もちろん、浮動小数点の精度が原因で問題が発生します...そのため、どの要素が一意であるかを判断するときに比較に使用するデルタ値を設定できるようにしたいと考えています。
これを実行する方法はありますか? 現時点では、単に次の操作を実行しています:
unique(array)
つまり、次のようになります。
array([ -Inf, 0.62962963, 0.62962963, 0.62962963, 0.62962963,
0.62962963])
同じに見える値(表示される小数点以下の桁数)は、明らかにわずかに異なります。
ベストアンサー1
もう 1 つの可能性は、最も近い望ましい許容値に丸めることです。
np.unique(a.round(decimals=4))
a
元の配列はどこにありますか。
編集:ちなみに、私のソリューションと @unutbu のソリューションは、私のタイミングによると、速度的にはほぼ同じ (私のソリューションの方が 5% 速いかもしれません) なので、どちらも良いソリューションです。
編集#2:これは、Paul の懸念に対処するためのものです。確かに遅くなり、最適化できる部分もあるかもしれませんが、戦略を示すためにそのまま投稿します。
def eclose(a,b,rtol=1.0000000000000001e-05, atol=1e-08):
return np.abs(a - b) <= (atol + rtol * np.abs(b))
x = np.array([6.4,6.500000001, 6.5,6.51])
y = x.flat.copy()
y.sort()
ci = 0
U = np.empty((0,),dtype=y.dtype)
while ci < y.size:
ii = eclose(y[ci],y)
mi = np.max(ii.nonzero())
U = np.concatenate((U,[y[mi]]))
ci = mi + 1
print U
精度範囲内に多くの重複値がある場合は、かなり高速になるはずですが、多くの値が一意である場合は、遅くなります。また、U
リストとして設定し、while ループを介して追加する方がよい場合もありますが、これは「さらなる最適化」に該当します。