#python #arrays #numpy
#python #массивы #numpy
Вопрос:
Я хочу добавить размеры в массив, но expand_dims всегда добавляет размерность размера 1.
Ввод:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Что делает expand_dims:
[[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]]
Чего я хочу:
[[[1, 1], [1, 2], [1, 3]], [[1, 4], [1, 5], [1, 6]], [[1, 7], [1, 8], [1, 9]]]
По сути, я хочу заменить каждый скаляр в матрице вектором [1, x]
, где x — исходный скаляр.
Ответ №1:
Вот один из способов использования широковещательной передачи и np.insert()
функции:
In [32]: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [33]: np.insert(a[:,:,None], 0, 1, 2)
Out[33]:
array([[[1, 1],
[1, 2],
[1, 3]],
[[1, 4],
[1, 5],
[1, 6]],
[[1, 7],
[1, 8],
[1, 9]]])
Комментарии:
1. Я понял это, используя
expand_dims
, который должен быть эквивалентенa[:,:,None]
, но в конце концов не нуждался в дополнительном измерении. Я все перепутал:np.insert(a, 0, 1, axis=1)
это все, что мне было нужно. Тем не менее, это все еще правильный ответ на мой вопрос. Спасибо
Ответ №2:
Существует множество способов построения нового массива.
Вы можете создать массив с правильной формой и заливкой и скопировать значения:
In [402]: arr = np.arange(1,10).reshape(3,3)
In [403]: arr
Out[403]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [404]: res = np.ones((3,3,2),int)
In [405]: res[:,:,1] = arr
In [406]: res
Out[406]:
array([[[1, 1],
[1, 2],
[1, 3]],
[[1, 4],
[1, 5],
[1, 6]],
[[1, 7],
[1, 8],
[1, 9]]])
Вы можете объединить массив с массивом аналогичного размера, равным 1s. concatenate
является основной функцией объединения:
In [407]: np.concatenate((np.ones((3,3,1),int), arr[:,:,None]), axis=2)
Out[407]:
array([[[1, 1],
[1, 2],
[1, 3]],
[[1, 4],
[1, 5],
[1, 6]],
[[1, 7],
[1, 8],
[1, 9]]])
np.stack((np.ones((3,3),int), arr), axis=2)
делает то же самое под прикрытием. np.dstack
(‘d’ для глубины) также делает это. insert
В другом ответе это также делается.