给定两个大小分别为aa
和bb
的数组,我需要将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中的相应元素被插入到索引之前,则的顺序将被保留”,这是不相同的。
答案 0 :(得分:1)
您必须计算aa
和bb
中每个元素之间的差,并取最小值:
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()之后,仅计算相邻值的差值。