#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]]])