如何解决在另一个数组的特定列中查找数组中最接近的元素
我想将一个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 举报,一经查实,本站将立刻删除。