Numpy: добавление строк матрицы поверх другой матрицы другого измерения

#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. Спасибо!