我试图以下列方式组合两个numpy数组
np.union1d( np.arange(0.1, 0.91, 0.1), np.arange(0.4, 0.81, 0.01) )
输出显示:
array([ 0.1 , 0.2 , 0.3 , 0.4 , 0.41, 0.42, 0.43, 0.44, 0.45,
0.46, 0.47, 0.48, 0.49, 0.5 , 0.5 , 0.51, 0.52, 0.53,
0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.6 , 0.61,
0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 ,
0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78,
0.79, 0.8 , 0.8 , 0.9 ])
在此联合的输出中,数字0.5的特征是两次。即使我在numpy中使用独特的功能,这个数字0.5的复制也不会消失。含义:
np.unique( np.union1d( np.arange(0.1, 0.91, 0.1), np.arange(0.4, 0.81, 0.01) ) )
也提供相同的输出。我究竟做错了什么?如何纠正这个并得到所需的输出(即我的数组中只有一次出现数字0.5?
答案 0 :(得分:2)
给定输入数组已排序,使用与this post
-
a[np.r_[True,~np.isclose(a[1:] , a[:-1])]]
示例运行 -
In [20]: a = np.union1d( np.arange(0.1, 0.91, 0.1), np.arange(0.4, 0.81, 0.01) )
In [21]: a
Out[21]:
array([ 0.1 , 0.2 , 0.3 , 0.4 , 0.41, 0.42, 0.43, 0.44, 0.45,
0.46, 0.47, 0.48, 0.49, 0.5 , 0.5 , 0.51, 0.52, 0.53,
0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.6 , 0.61,
0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 ,
0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78,
0.79, 0.8 , 0.8 , 0.9 ])
In [22]: a[np.r_[True,~np.isclose(a[1:] , a[:-1])]]
Out[22]:
array([ 0.1 , 0.2 , 0.3 , 0.4 , 0.41, 0.42, 0.43, 0.44, 0.45,
0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63,
0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72,
0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8 , 0.9 ])
答案 1 :(得分:1)
正如我在评论中所写,由于浮点精度及其比较,这将是一个问题。如果适用于您的特定情况,我建议您使用整数并在以后进行标准化。
例如
x = np.union1d( np.arange(10, 91, 10), np.arange(40, 81, 1) )
x = x/100.0
输出:
[ 0.1 0.2 0.3 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48
0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6
0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72
0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.9 ]
答案 2 :(得分:1)
正如@ImNt在评论中所述,这可能是由于浮点比较/精度(可能它们在内存中不是0.5,而是0.500000000001)
但是,您可以制定解决方法。您知道您的号码最多为2位数。然后,您可以在应用np.round
之前先np.unique
数组。
x = np.union1d( np.arange(0.1, 0.91, 0.1), np.arange(0.4, 0.81, 0.01) )
x = np.round(x, 2) # Round 2 floating points
x = np.unique(x)
输出:
array([ 0.1 , 0.2 , 0.3 , 0.4 , 0.41, 0.42, 0.43, 0.44, 0.45,
0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63,
0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72,
0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8 , 0.9 ])
答案 3 :(得分:1)
或者您可以使用Fraction
s:
>>> import numpy as np
>>> from fractions import Fraction
>>> np.union1d( np.arange(Fraction(1,10), Fraction(91,100), Fraction(1,10)), np.arange(Fraction(4,10), Fraction(81,100),Fraction(1,100)))
array([Fraction(1, 10), Fraction(1, 5), Fraction(3, 10), Fraction(2, 5),
Fraction(41, 100), Fraction(21, 50), Fraction(43, 100),
Fraction(11, 25), Fraction(9, 20), Fraction(23, 50),
Fraction(47, 100), Fraction(12, 25), Fraction(49, 100),
Fraction(1, 2), Fraction(51, 100), Fraction(13, 25),
Fraction(53, 100), Fraction(27, 50), Fraction(11, 20),
Fraction(14, 25), Fraction(57, 100), Fraction(29, 50),
Fraction(59, 100), Fraction(3, 5), Fraction(61, 100),
Fraction(31, 50), Fraction(63, 100), Fraction(16, 25),
Fraction(13, 20), Fraction(33, 50), Fraction(67, 100),
Fraction(17, 25), Fraction(69, 100), Fraction(7, 10),
Fraction(71, 100), Fraction(18, 25), Fraction(73, 100),
Fraction(37, 50), Fraction(3, 4), Fraction(19, 25),
Fraction(77, 100), Fraction(39, 50), Fraction(79, 100),
Fraction(4, 5), Fraction(9, 10)], dtype=object)
>>> _.astype(float)
array([ 0.1 , 0.2 , 0.3 , 0.4 , 0.41, 0.42, 0.43, 0.44, 0.45,
0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63,
0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72,
0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8 , 0.9 ])