Эффективно заменить значения np.darray на 1-dim np.darrays логическим правилом? - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу заменить значения np.darray на 1d массивы, которые представляют пиксели RGB.

Например:

array([[0.7, 0.2],
       [0.1, 0.4]])

преобразовать, по правилу array_value> 0.5, в

array([[[255, 255, 255],
        [  0,   0,   0]],
       [[  0,   0,   0],
        [  0,   0,   0]]])

Есть ли более эффективный по времени метод для этого, чем np.apply_along_axis?

Я могу сделать это с помощью np.apply_along_axis, но этот метод довольно медленный:

values = np.array([[0.7, 0.2], 
                   [0.1, 0.4]])

pixel_0 = np.array([0, 0, 0])
pixel_1 = np.array([255, 255, 255])
replace_scalar_by_RGB_pixel = lambda x: pixel_1 if x > 0.5 else pixel_0

np.apply_along_axis(replace_scalar_by_RGB_pixel, 2, np.expand_dims(values, 2))

Output: 
array([[[255, 255, 255],
        [  0,   0,   0]],
       [[  0,   0,   0],
        [  0,   0,   0]]])

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Вот для чего np.where:

>>> np.where(values[...,None]>0.5,pixel_1,pixel_0)
array([[[255, 255, 255],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [  0,   0,   0]]])
0 голосов
/ 08 апреля 2020

Вы можете использовать индексацию логического массива, чтобы создать новый массив с намеченной формой и замененными пикселями, например:

values = np.array([[0.7, 0.2], [0.1, 0.4]])
pixel_0 = np.array([0, 0, 0])
pixel_1 = np.array([255, 255, 255])
shape = values.shape
output = np.zeros((shape[0], shape[1], 3))
output[values > 0.5] = pixel_1
output[values <= 0.5] = pixel_0

...