用另一个数组中最接近的值替换numpy数组中的元素

时间:2018-08-22 18:19:30

标签: python numpy

给定两个大小分别为aabb的数组,我需要将aa中的元素替换为bb中最接近的元素。

这就是我现在所拥有的。它可以 [*] ,但是我想知道是否有更好的方法。

import numpy as np

# Some random data
aa = np.random.uniform(0., 1., 100)
bb = np.array([.1, .2, .4, .55, .97])

# For each element in aa, find the index of the nearest element in bb
idx = np.searchsorted(bb, aa)
# For indexes to the right of the rightmost bb element, associate to the last
# bb element.
msk = idx > len(bb) - 1
idx[msk] = len(bb) - 1

# Replace values in aa
aa = np.array([bb[_] for _ in idx])


[*] :实际上几乎有效。如注释中所指出的,np.searchsorted不会返回最接近元素的索引,而是将<< em> indices插入排序数组a中,这样,如果v中的相应元素被插入到索引之前,则的顺序将被保留”,这是不相同的。

2 个答案:

答案 0 :(得分:1)

您必须计算aabb中每个元素之间的差,并取最小值:

aa_nearest = bb[abs(aa[None, :] - bb[:, None]).argmin(axis=0)]

答案 1 :(得分:0)

毫无疑问,丹尼尔(Daniel)的回答令人印象深刻,但是对于大型阵列而言,这可能会很慢,因为计算和比较的次数将会很高

另一种方法是

import numpy as np
aa = np.random.uniform(0., 1., 100)
bb = np.array([.1, .2, .4, .55, .97])
idx = np.searchsorted(bb, aa)
msk = idx > len(bb) - 1
idx[msk] = len(bb) - 1

idx_new=np.array([idx[i]-1 if abs(bb[idx[i]-1]-aa[i])<abs(bb[idx[i]]-aa[i]) else idx[i] for i in range(len(idx))])
aa = np.array([bb[_] for _ in idx_new])

在使用searchsorted()之后,仅计算相邻值的差值。

相关问题