Вот одна из возможностей:
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), кроме случаев, когда вы даете две замены для одного и того же значения в Да, это было бы неправильно в любом случае. Однако его сложность во времени и пространстве является результатом размеров 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]