这是一种可能性:
import numpy as np
Xold = np.array([0, 1, 2, 3, 4])
Y = np.array([[0, 0], [1, 100], [3, 300], [4, 400], [2, 200]])
# Check every X value against every Y first value
m = Xold == Y[:, 0, np.newaxis]
# Check which elements in X are among Y first values
# (so values that are not in Y are not replaced)
m_X = np.any(m, axis=0)
# Compute replacement
# Xold * (1 - m_X) are the non-replaced values
# np.sum(Y[:, 1, np.newaxis] * m, axis=0) * m_X are the replaced values
Xnew = Xold * (1 - m_X) + np.sum(Y[:, 1, np.newaxis] * m, axis=0) * m_X
print(Xnew)
输出:
[ 0 100 200 300 400]
此方法或多或少适用于每种情况(未排序的数组、X 中值的多次重复、X 中的值未替换、Y 中的值未替换 X 中的任何内容),除非您为 Y 中的相同值提供两个替换,这无论如何都会错的。但是,它的时间和空间复杂度是 X 和 Y 大小的乘积。如果您的问题有其他限制(数据已排序、没有重复等),则可能会做得更好。例如,如果 X 没有重复元素进行排序,并且 Y 中的每个值都替换了 X 中的一个值(就像在您的示例中一样),这可能会更快:
import numpy as np
Xold = np.array([0, 1, 2, 3, 4])
Y = np.array([[0, 0], [1, 100], [3, 300], [4, 400], [2, 200]])
idx = np.searchsorted(Xold, Y[:, 0])
Xnew = Xold.copy()
Xnew[idx] = Y[:, 1]
print(Xnew)
# [ 0 100 200 300 400]