EDIT: I implemented a version of TensorFlow about this in this answer (almost the same, except for the replacement are dictate).
Here is an easy way to do this:
import numpy as np numbers = np.arange(0,40) np.random.shuffle(numbers) problem_numbers = [33, 23, 15]
This works well and should be effective as long as the range of values ββin numbers (the difference between the smallest and the largest) is not large (for example, you don't have something like 1 , 7 and 10000000000 ).
Benchmarking
I compared the code in OP with the three (currently) proposed solutions with this code:
import numpy as np def method_itzik(numbers, problem_numbers, alternative_numbers): numbers = np.asarray(numbers) for i in range(len(problem_numbers)): idx = numbers == problem_numbers[i] numbers[idx] = alternative_numbers[i] return numbers def method_mseifert(numbers, problem_numbers, alternative_numbers): numbers = np.asarray(numbers) replacer = dict(zip(problem_numbers, alternative_numbers)) numbers_list = numbers.tolist() numbers = np.array(list(map(replacer.get, numbers_list, numbers_list))) return numbers def method_divakar(numbers, problem_numbers, alternative_numbers): numbers = np.asarray(numbers) problem_numbers = np.asarray(problem_numbers) problem_numbers = np.asarray(alternative_numbers)
Results, achievements:
import numpy as np np.random.seed(100) MAX_NUM = 100000 numbers = np.random.randint(0, MAX_NUM, size=100000) problem_numbers = np.unique(np.random.randint(0, MAX_NUM, size=500)) alternative_numbers = np.random.randint(0, MAX_NUM, size=len(problem_numbers)) %timeit method_itzik(numbers, problem_numbers, alternative_numbers) 10 loops, best of 3: 63.3 ms per loop