查找向量化

Vectorization of lookup

我有一个值数组,想将每个值与另一个数组中的值进行映射。映射值是找到的最大值,小于或等于(我假设它始终存在)。

例如,根据值 [6, 15, 4, 12, 10, 5] 和查找 table [4, 6, 7, 8, 10, 12] 我会打印:

6 is between 6 and 7
15 is between 12 and None
4 is between 4 and 6
12 is between 12 and None
10 is between 10 and 12
5 is between 4 and 6

我是这样做的:

import numpy as np

def last_smallest(values, limits):
    count = values.shape[0]
    value = np.zeros(count, dtype='int')
    for i in range(count):
        found = np.where(limits <= values[i])
        value[i] = found[-1][-1]
    return value

lookup_table = np.array([4, 6, 7, 8, 10, 12])
samples = np.array([6, 15, 4, 12, 10, 5])
result = last_smallest(samples, lookup_table)
for i, value in enumerate(samples):
    index = result[i]
    high = lookup_table[index+1] if index < lookup_table.shape[0] - 1 else None
    print(f'{value} is between {lookup_table[index]} and {high}')

这个可以,但是 last_smallest 函数确实不优雅。我试过矢量化它,但我做不到。

是否可以用纯粹的numpy数组操作来代替result = last_smallest(samples, lookup_table)

np.digitize可以在这里使用:

lookup_table = np.array([4, 6, 7, 8, 10, 12])
samples = np.array([6, 15, 4, 12, 10, 5])
res = np.digitize(samples, lookup_table)

lookup_table = np.append(lookup_table, None) # you might want to change this line

for sample, idx in zip(samples, res):
    print(f'{sample} is between {lookup_table[idx-1]} and {lookup_table[idx]}')

输出:

6 is between 6 and 7
15 is between 12 and None
4 is between 4 and 6
12 is between 12 and None
10 is between 10 and 12
5 is between 4 and 6