CocoaChina 11-08
python-从一个数组中查找不同数组中某个元.
index_new4.html
../../../zaker_core/zaker_tpl_static/wap/tpl_keji1.html

 

这个问题已经在这里有了答案:????????????>????????????Selecting close matches from one array based on another reference array????????????????????????????????????3 个

我有两个不等长的 numpy 数组:

a = numpy.array ( [ 108, 637, 1172, 1304, 2260, 2809 ] ) b = numpy.array ( [ 109, 634, 2254, 2814 ] )

我想缩短一个 , 使每个数组中的对应元素相似 . 这种对应的标准是当 b 的元素在以下范围内时:元素 a-50< 50. 元素 b

a_prime = numpy.array ( [ 108, 637, 2260, 2809 ] ) b_prime = numpy.array ( [ 109, 634, 2254, 2814 ] )

我可以使用 double for 循环配置来实现此目的:

a_prime = numpy.zeros ( b.shape [ 0 ] , dtype = int ) b_prime = numpy.copy ( b ) for idx, element_b in enumerate ( b ) : for element_a in a: if ( element_a - 50 ) < element_b < ( element_a + 50 ) : a_prime [ idx ] = element_a

但是 , 对于大阵列长度 , 这将非常耗时 . 实现相同结果的快速 , 更加 Python 化的方法是什么?

最佳答案

这是获取 a_prime 的一种方法 , 其中无论阈值如何 ,a 中与 b 中给定值最接近的值都设置为相同的索引 , 因为您一直在寻找最接近的值:

a_prime = a [ np.abs ( np.subtract.outer ( b,a ) ) .argmin ( 1 ) ] # array ( [ 108, 637, 2260, 2809 ] )

其中np.substract.outer将为您提供 b 中每个值与 a 中其他每个值的差 , 并取其绝对值可得出:

x = np.abs ( np.subtract.outer ( b,a ) ) print ( x ) array ( [ [ 1, 528, 1063, 1195, 2151, 2700 ] , [ 526, 3, 538, 670, 1626, 2175 ] , [ 2146, 1617, 1082, 950, 6, 555 ] , [ 2706, 2177, 1642, 1510, 554, 5 ] ] )

现在我们只需要每行的argmin值 , 并使用它来索引 a:

x.argmin ( 1 ) # array ( [ 0, 1, 4, 5 ] , dtype=int64 )

相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论