Отображение значений в массиве NumPy - PullRequest
0 голосов
/ 22 января 2019

Как мне перейти из двумерного массива, где у меня есть только три различных значения: -1, 0 и 1, и сопоставить их с цветами red (255,0,0), green (0,255, 0) и blue (255,0,0)? Массив довольно большой, но чтобы дать вам представление о том, что я ищу, представьте, что у меня есть ввод

array([[ 1,  0, -1],
       [-1,  1,  1],
       [ 0,  0,  1]])

Я хочу вывод:

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

Я мог бы за цикл и иметь условия, но мне было интересно, есть ли один или два лайнера, использующие лямбда-функцию, которая могла бы выполнить это? Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Возможно, вы захотите рассмотреть структурированный массив, так как он допускает кортежи без типа данных object.

import numpy as np

replacements = {-1: (255, 0, 0), 0: (0, 255, 0), 1: (0, 0, 255)}

arr = np.array([[ 1,  0, -1],
                [-1,  1,  1],
                [ 0,  0,  1]])

new = np.zeros(arr.shape, dtype=np.dtype([('r', np.int32), ('g', np.int32), ('b', np.int32)]))

for n, tup in replacements.items():
    new[arr == n] = tup

print(new)

Выход:

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

Другой вариант - использование трехмерного массива, где последнее измерение - 3. Первый «слой» будет красным, второй «слой» будет зеленым, а третий «слой» синим. Эта опция совместима с plt.imshow().

import numpy as np

arr = np.array([[ 1,  0, -1],
                [-1,  1,  1],
                [ 0,  0,  1]])

new = np.zeros((*arr.shape, 3))

for i in range(-1, 2):
    new[i + 1, arr == i] = 255

Выход:

array([[[  0.,   0., 255.],
        [255.,   0.,   0.],
        [  0.,   0.,   0.]],

       [[  0., 255.,   0.],
        [  0.,   0.,   0.],
        [255., 255.,   0.]],

       [[255.,   0.,   0.],
        [  0., 255., 255.],
        [  0.,   0., 255.]]])
...