我有两个1D numpy数组。长度不等。我想制作彼此接近的元素对(array1_elemnt,array2_element)。让我们考虑以下示例
a = [1,2,3,8,20,23]
b = [1,2,3,5,7,21,35]
预期结果是
[(1,1),
(2,2),
(3,3),
(8,7),
(20,21),
(23,25)]
重要的是要注意5是独自留下的。它可以很容易地通过循环完成,但我有非常大的数组。我考虑过使用最近邻居。但感觉就像用正典杀死一只麻雀。
任何人都可以建议任何优雅的解决方案。
非常感谢。
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以使用内置的map函数来矢量化执行此操作的函数。例如:
ar1 = np.array([1,2,3,8,20,23])
ar2 = np.array([1,2,3,5,7,21,35])
def closest(ar1, ar2, iter):
x = np.abs(ar1[iter] - ar2)
index = np.where(x==x.min())
value = ar2[index]
return value
def find(x):
return closest(ar1, ar2, x)
c = np.array(map(find, range(ar1.shape[0])))
在上面的示例中,看起来您希望在配对后排除值。在这种情况下,您可以在第一个函数中包含一个删除过程,但是要非常小心数组1的排序方式:
def closest(ar1, ar2, iter):
x = np.abs(ar1[iter] - ar2)
index = np.where(x==x.min())
value = ar2[index]
ar2[ar2==value] = -10000000
return value
答案 2 :(得分:0)
我能想到的最好的方法是使用循环。如果python中的循环很慢,可以使用Cython加速编码。
答案 3 :(得分:0)
我认为可以这样做:
排序应该是最慢的步骤,并且堆栈的最大总空间是n或m。
答案 4 :(得分:0)
您可以执行以下操作:
a = np.array([1,2,3,8,20,23]) b = np.array([1,2,3,5,7,21,25]) def find_closest(a, sorted_b): j = np.searchsorted(.5*(sorted_b[1:] + sorted_b[:-1]), a, side='right') return b[j] b.sort() # or, b = np.sort(b), if you don't want to modify b in-place print np.c_[a, find_closest(a, b)] # -> # array([[ 1, 1], # [ 2, 2], # [ 3, 3], # [ 8, 7], # [20, 21], # [23, 25]])
这应该很快。它的工作原理是searchsorted
会在每个数字a
找到b
之后的两个数字之间的中点,即最接近的数字。