Как добавить нулевой вектор или матрицу в 3D-массив в Python

#python #arrays

#python #массивы

Вопрос:

У меня есть 3D-матрица:

 array = np.array([[[1,2,3,4,5],[4,5,6,1,3], [7,8,9,6,7],[1,2,3,5,5],[4,5,6,8,9], [7,8,9,4,7]],[[1,2,3,4,5],[4,5,6,1,3], [7,8,9,6,7],[1,2,3,5,5],[4,5,6,8,9], [7,8,9,4,7]]])
 

Это приводит к матрице в виде:

 array([[[1, 2, 3, 4, 5],
        [4, 5, 6, 1, 3],
        [7, 8, 9, 6, 7],
        [1, 2, 3, 5, 5],
        [4, 5, 6, 8, 9],
        [7, 8, 9, 4, 7]],

       [[1, 2, 3, 4, 5],
        [4, 5, 6, 1, 3],
        [7, 8, 9, 6, 7],
        [1, 2, 3, 5, 5],
        [4, 5, 6, 8, 9],
        [7, 8, 9, 4, 7]]])
 

Теперь я хочу добавить нулевой вектор или матрицу, созданные с помощью

 x = np.zeros((1,5))
 

с матричным массивом таким образом, что результат становится:

 array([[[1, 2, 3, 4, 5],
        [4, 5, 6, 1, 3],
        [7, 8, 9, 6, 7],
        [1, 2, 3, 5, 5],
        [4, 5, 6, 8, 9],
        [7, 8, 9, 4, 7],
        [0, 0, 0, 0, 0]],

      [[1, 2, 3, 4, 5],
        [4, 5, 6, 1, 3],
        [7, 8, 9, 6, 7],
        [1, 2, 3, 5, 5],
        [4, 5, 6, 8, 9],
        [7, 8, 9, 4, 7],
        [0, 0, 0, 0, 0]]])
 

Кто-нибудь может помочь? Я пробовал использовать конкатенацию и стеки, включая dstack, но они не сработали (или я не смог правильно реализовать).
Я пытался

 a = np.vstack((array[0], x))
b =  np.vstack((array[1], x))
 

затем я попытался объединить их в качестве 3D-массива, используя dstack как:

 np.dstack((a, b))
 

это не сработало.

Прямая конкатенация (np.concatenate(array, x)), конечно, не может работать. Вот почему я попытался создать 3D-массив нулей, но, возможно, np.zeros создают только 2D-массивы (или 1D, если одно измерение равно 1).

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

1. Пожалуйста, напишите, что вы пробовали, и каким образом это «не сработало».

2. @ScottHunter я только что это сделал

Ответ №1:

Допустим arr , это ваш (2, 6, 5) фигурный массив.

Сначала создайте массив нулей подходящей формы:

 zeros = np.zeros((2, 1, 5))
 

Этот массив содержит строку нулей из 5 элементов для каждой «страницы» вашего трехмерного массива.

Затем используйте concatenate (поскольку вы хотите присоединиться вдоль существующей оси):

 np.concatenate((arr, zeros), axis=1)
 

Результат:

 array([[[1., 2., 3., 4., 5.],
        [4., 5., 6., 1., 3.],
        [7., 8., 9., 6., 7.],
        [1., 2., 3., 5., 5.],
        [4., 5., 6., 8., 9.],
        [7., 8., 9., 4., 7.],
        [0., 0., 0., 0., 0.]],

       [[1., 2., 3., 4., 5.],
        [4., 5., 6., 1., 3.],
        [7., 8., 9., 6., 7.],
        [1., 2., 3., 5., 5.],
        [4., 5., 6., 8., 9.],
        [7., 8., 9., 4., 7.],
        [0., 0., 0., 0., 0.]]])
 

Ответ №2:

Вы можете использовать np.append для этого, а затем объединить два 3D-массива, используя np.concatenate , например

 a = np.array([[[1,2,3,4,5],[4,5,6,1,3], [7,8,9,6,7],[1,2,3,5,5],[4,5,6,8,9], [7,8,9,4,7]],[[1,2,3,4,5],[4,5,6,1,3], [7,8,9,6,7],[1,2,3,5,5],[4,5,6,8,9], [7,8,9,4,7]]])

z = np.zeros((1,5), dtype=int)
new = np.append(a[0], z, axis=0)
new1 = np.append(a[1], z, axis=0)

new2 = np.concatenate(([new], [new1]))

print(new2)
 

Вывод;

 [[[1 2 3 4 5]
  [4 5 6 1 3]
  [7 8 9 6 7]
  [1 2 3 5 5]
  [4 5 6 8 9]
  [7 8 9 4 7]
  [0 0 0 0 0]]

 [[1 2 3 4 5]
  [4 5 6 1 3]
  [7 8 9 6 7]
  [1 2 3 5 5]
  [4 5 6 8 9]
  [7 8 9 4 7]
  [0 0 0 0 0]]]