#python #numpy #matrix
#python #numpy #матрица
Вопрос:
У меня есть две матрицы
A = np.array(
[[1,2,3],
[4,5,6],
[7,8,9]])
B = np.array(
[[1,1,1],
[2,2,2]])
Я хотел бы иметь матрицу размером 3x3x2, которая равна [[A первая строка B], [A вторая строка B]]
C = np.array(
[[[2,3,4],
[5,6,7],
[8,9,10]],
[[3,4,5],
[6,7,8],
[9,10,11]]])
Я знаю, что мог бы выполнить np.concatenate((A B[0], A B[1])) , но я не буду знать, сколько строк B содержит заранее, и для моего собственного опыта программирования мне любопытно, есть ли более чистый способ сделать это.
Ответ №1:
Ваши A =
B =
команды и генерируют не матрицы, а списки списков. Разница имеет значение, потому что к ним не прикреплена хорошая векторная математика numpy.
В любом случае, вы можете расширить A
, создав новую ось с помощью [:,None]
, выполните добавление, а затем поменяйте местами оси, чтобы получить нужную форму:
>>> A = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> B = np.array([[1,1,1], [2,2,2]])
>>> (A[:, None] B).swapaxes(0,1)
array([[[ 2, 3, 4],
[ 5, 6, 7],
[ 8, 9, 10]],
[[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]]])
Обратите внимание, что это имеет форму (2,3,3), а не (3,3,2), но это форма, которую имел ваш C, поэтому я пошел с этим.
Комментарии:
1. Ах, да, я не имел в виду, что я использую списки вместо массивов numpy. Ваше решение очень хорошее, мне придется добавить создание новых осей и изменение формы в мой арсенал numpy. Спасибо!