KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am trying to translate every element of a numpy.array according to a given key: For example: a = np.array([[1,2,3], [3,2,4]]) my_dict = {1:23, 2:34, 3:36, 4:45} I want to get: array([[ 23., 34., 36.], [ 36., 34., 45.]]) I can see how to do it with a loop: def loop_translate(a, my_dict): new_a = np.empty(a.shape) for i,row in enumerate(a): new_a[i,:] = map(my_dict.get, row) return new_a Is there a more efficient and/or pure numpy way? Edit: I timed it, and np.vectorize method proposed by DSM is considerably faster for larger arrays: In [13]: def loop_translate(a, my_dict): ....: new_a = np.empty(a.shape) ....: for i,row in enumerate(a): ....: new_a[i,:] = map(my_dict.get, row) ....: return new_a ....: In [14]: def vec_translate(a, my_dict): ....: return np.vectorize(my_dict.__getitem__)(a) ....: In [15]: a = np.random.randint(1,5, (4,5)) In [16]: a Out[16]: array([[2, 4, 3, 1, 1], [2, 4, 3, 2, 4], [4, 2, 1, 3, 1], [2, 4, 3, 4, 1]]) In [17]: %timeit loop_translate(a, my_dict) 10000 loops, best of 3: 77.9 us per loop In [18]: %timeit vec_translate(a, my_dict) 10000 loops, best of 3: 70.5 us per loop In [19]: a = np.random.randint(1, 5, (500,500)) In [20]: %timeit loop_translate(a, my_dict) 1 loops, best of 3: 298 ms per loop In [21]: %timeit vec_translate(a, my_dict) 10 loops, best of 3: 37.6 ms per loop In [22]: %timeit loop_translate(a, my_dict)
Tags (comma-separated)
Save Edits
Cancel