假设我有一个NumPy数组:
x = np.array([[0, 5],
[1, 6],
[4, 3],
[2, 4],
[3, 2]])
还有一个"查找"数组,它告诉我如何将一个整数(第一列(映射到另一个整数(第二列(:
lookup = np.array([[0, 50],
[1, 16],
[2, 47],
所以,0 -> 50
、1 -> 16
和2 -> 47
。请注意,整数[3, 4, 5, 6]
不在查找中,因此不需要更改。一个简单的方法是:
for i in range(lookup.shape[0]):
num = lookup[i, 0]
x[x == num] = lookup[i, 1]
预期输出应为:
np.array([[50, 5],
[16, 6],
[4, 3],
[47, 4],
[3, 47]])
对于大型 2D 数组x
和更大的lookup
,有没有更有效的方法在 NumPy 中以矢量化方式做到这一点?
对于x
不包含负整数或大整数的情况,我的方法:
a = np.arange(x.max()+1)
a[lookup[:,0]] = lookup[:,1]
x = a[x]
希望这有帮助!
x = np.array([[0, 5],
[1, 6],
[4, 3],
[2, 4],
[3, 2]])
lookup = np.array([[0, 50],
[1, 16],
[2, 47]])
# building a dictionary
lookup = {each[0]:each[1] for each in lookup}
vfunc = np.vectorize(lambda x: lookup.get(x, x))
vfunc(x) # gives your result
输出
array([[50, 5],
[16, 6],
[ 4, 3],
[47, 4],
[ 3, 47]])