Используйте mapper
Вы можете создать массив отображения, а затем просто индексирование с помощью входного массива даст нам желаемый результат -
mapper = np.array([0,0,1,2,2])
out = mapper[a] # a is input array
Сроки для всех опубликованных решений с одинаковой заданной формой - (601, 462, 951))
-
In [60]: np.random.seed(0)
...: a = np.random.randint(0,5,(601, 462, 951))
# @yatu's soln
In [61]: %timeit np.select([a==1, a==2, (a==3)|(a==4)], [0,1,2])
1 loop, best of 3: 5 s per loop
# Posted in this post
In [62]: %%timeit
...: mapper = np.array([0,0,1,2,2])
...: out = mapper[a]
1 loop, best of 3: 849 ms per loop
# @Austin's soln
In [63]: %%timeit
...: a[a == 1] = 0
...: a[a == 2] = 1
...: a[(a == 3) | (a == 4)] = 2
1 loop, best of 3: 1.04 s per loop
Дальнейшее усиление с d-типом с низкой точностью
Поскольку выходные данные будут иметь метки - 0,1,2
, мы можем смело использовать UINT8
в качестве выходного типа данных и получить огромный прирост производительности. Итак, это будет -
mapper = np.array([0,0,1,2,2],dtype=np.uint8)
out = mapper[a]
Сроки -
In [66]: np.random.seed(0)
...: a = np.random.randint(0,5,(601, 462, 951))
In [67]: %%timeit
...: mapper = np.array([0,0,1,2,2],dtype=np.uint8)
...: out = mapper[a]
1 loop, best of 3: 380 ms per loop