我有两个不等长的numpy数组:
a = numpy.array([108, 637, 1172, 1304, 2260, 2809])
b = numpy.array([109, 634, 2254, 2814])
我想缩短a
,使每个数组中的对应元素相似。该对应关系的标准是当b
的元素位于范围element a - 50 < element b < element a + 50
中时。因此,来自108
的值为a
的元素与来自109
的值为b
的元素相匹配。结果输出应为:
a_prime = numpy.array([108, 637, 2260, 2809])
b_prime = numpy.array([109, 634, 2254, 2814])
我可以使用双for
循环配置来实现此目的:
a_prime = numpy.zeros(b.shape[0], dtype = int)
b_prime = numpy.copy(b)
for idx, element_b in enumerate(b):
for element_a in a:
if (element_a - 50) < element_b < (element_a + 50):
a_prime[idx] = element_a
但是,对于大阵列长度,这将非常耗时。实现相同结果的快速,更Python化的方法是什么?
答案 0 :(得分:3)
这是获取a_prime
的一种方法,其中与阈值无关,将a
中与b
中给定值最接近的值设置为相同的索引毕竟寻找最接近的值:
a_prime = a[np.abs(np.subtract.outer(b,a)).argmin(1)]
# array([ 108, 637, 2260, 2809])
在np.substract.outer
处将为您提供b
中的每个值与a
中的其他所有值的差,并取其绝对值可得出:
x = np.abs(np.subtract.outer(b,a))
print(x)
array([[ 1, 528, 1063, 1195, 2151, 2700],
[ 526, 3, 538, 670, 1626, 2175],
[2146, 1617, 1082, 950, 6, 555],
[2706, 2177, 1642, 1510, 554, 5]])
现在我们只需要每行的argmin
值,并使用它来索引a
:
x.argmin(1)
# array([0, 1, 4, 5], dtype=int64)