[英]Remove common elements in numpy array
我正在尝试以以下方式合并两个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?
鉴于输入数组进行排序,使用同样的理念在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 ])
正如我在评论中所写,由于浮点精度及其比较,这将成为一个问题。 如果适用于您的特定情况,我建议您使用整数并稍后进行规范化。
例如
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 ]
如@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 ])
或者您可以使用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 ])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.