Массив Numpy: как преобразовать значения 2D-массива в 3D-массив hot

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

У меня есть числовой 2D-массив ‘ya’ формы (1000, 20), где каждая ячейка имеет значения от 0 до 5. Я хотел бы создать 3D-массив ‘yb’ формы (1000, 6, 20), который я создаю с помощью np.zeros((1000, 6, 20)), где ячейки в dim(1) будут принимать значение 1 в столбце, соответствующем значению ya.

Пример: ya[125, 12] = 4 и ya[248,7] = 1

=> yb[125, 4, 12] = 1 и yb[248, 1, 7] = 1

и все остальные ячейки yb[125, i!= 4, 12] и [248, i! = 1, 7] = 0

Есть ли хороший способ сделать это без циклов? Я надеюсь, что мой вопрос достаточно ясен … 😉

Заранее большое спасибо.

Упрощенный пример с 1-мерным массивом, расширенным в 2-мерный, и значениями от 0 до 2 :

ya = ([0, 2, 1, 1, 0])

yb = ([1, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 0], [1, 0, 0])

Основная идея заключается в замене значений на 0 или 1 в новом измерении массива.

Комментарии:

1. Я не понимаю желаемого результата. Возможно, было бы проще создать пример того, что вы хотите, чтобы произошло. Т.е. Вывод python, показывающий желаемое до и после. Я не понимаю, как мы берем ya[125, 12] и получаем 4 .

2. Я только что добавил простой пример того, чего я пытаюсь достичь…

Ответ №1:

Попробуйте широковещательную передачу:

 (a[:,None,:] == np.arange(6)[None,:,None]).astype(int)
 

Пример данных:

 np.random.seed(1)
m,n=3,4
a = np.random.randint(0,6, (m,n))
 

Вывод:

 array([[[0, 0, 0, 1],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 1, 0],
        [1, 0, 0, 0]],

       [[0, 0, 0, 1],
        [1, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 1, 0]],

       [[1, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]]])