微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在另一个数组的特定列中查找数组中最接近的元素

如何解决在另一个数组的特定列中查找数组中最接近的元素

我想将一个numpy数组映射到另一个。我的第一个数组有两列和数千行:

arr_1 = [[20,0.5],[30,0.75],[40,1.0],[50,1.25],[60,1.5],[70,1.75],...]

第二个数组可以具有不同数量的行和列:

arr_2 = [[1,0.45],[2,0.57],[4,0.58],[1,1.69],1.51],0.95],...]

我想将arr_2的第二列与arr_1的第二列的值进行比较,以了解arr_2的哪一行更接近arr_1的哪一行。然后,我想将arr_1的第一列从第二列最近的行复制到arr_2中。

例如,0.45中的arr_2最接近0.5,即arr_1中的第一行。找到该行之后,我想将该行的第一列(即20)复制到arr_2中。最终结果将类似于:

arr_2_final = [[1,0.45,20],0.57,0.58,1.69,70],1.51,60],0.95,40],...]

解决方法

在对数组进行排序时,最简单的方法是查找数组中的许多项目。您可以将大部分工作委托给np.searchsorted。由于我们要在arr_1中查找元素,因此它是唯一需要排序的数组。我怀疑排序arr_2可以通过减少每个连续元素的搜索空间来加快处理速度。

首先,找到arr_2会以arr_1结尾的插入点:

indices = np.searchsorted(arr_1[:,1],arr_2[:,1])

现在您要做的就是检查前一个元素比当前元素更近的情况。有两种极端的情况:当索引为0时,您必须接受它;而当索引为arr_1.size时,您必须先使用索引。

indices[indices == arr_1.shape[0]] = arr_1.shape[0] - 1
indices[(indices != 0) & (arr_1[indices,1] - arr_2[:,1] > arr_2[:,1] - arr_1[indices - 1,1])] -= 1

按此顺序进行操作可以避免麻烦您将临时数组弄乱。第一行确保索引arr_1[indices,1]始终有效。由于索引-1有效,因此第二行也成功。

那么最终结果就是

np.concatenate((arr_2,arr_1[indices,0:1]),axis=1)

如果arr_1尚未排序,则可以执行以下操作:

arr_1 = arr1[np.argsort(arr_1[:,1]),:]

一个快速的基准测试表明,在我的中等功率机器上,arr_1.shape = (500000,2)arr_2.shape = (300000,2)这种方法大约需要300毫秒。

,

我可能会这样:

import numpy as np

arr_1= [[20,0.5],[30,0.75],[40,[50,1.25],[60,1.5],[70,1.75]]
arr_2= [[1,0.45],[2,0.57],[4,0.58],[1,1.69],1.51],0.95]]

arr_2_np = np.array(arr_2)[:,1]

for row in arr_1:
  idx = np.argmin(np.abs(arr_2_np - row[1]))
  arr_2[idx].append(row[0])

print(arr_2)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?