Разверните 2D-массив в 3D-массив с заданной длиной c - PullRequest
0 голосов
/ 11 марта 2020

У меня есть массив 100x100 numpy, который я хочу добавить для него в третье измерение длиной 3 с [1,0,1]. Я пытаюсь сделать это без для L oop, если это возможно. Перепробовал все виды вещей, таких как np.newaxis, но он только расширяет измерение с длиной 1, и тогда он не может быть заполнен массивом длины 3.

Спасибо yiu

Ответы [ 2 ]

1 голос
/ 11 марта 2020

В зависимости от того, что вы хотите, у вас есть несколько вариантов:

import numpy as np
arr = np.random.random((100, 100))
some_numbers = [1, 0, 1]

# A
new_arr = np.empty(arr.shape + (3,))
new_arr[..., :] = some_numbers
# array([[[1., 0., 1.],
#         [1., 0., 1.],
#         [1., 0., 1.], 
#         ...,

# A2
new_arr = np.empty(arr.shape + (len(some_numbers) + 1,))
new_arr[..., 0] = arr[..., np.newaxis]
new_arr[..., 1:] = some_numbers
# array([[[0.2853, 1., 0., 1.],
#         [0.7324, 1., 0., 1.],
#         [0.0706, 1., 0., 1.],
#         ...,

# B
new_arr = np.empty(arr.shape + (3,))
new_arr[..., :] = arr[..., np.newaxis]

# C
new_arr = np.repeat(arr[..., np.newaxis], 3, axis=-1)
# array([[[0.2853, 0.2853, 0.2853],
#         [0.7324, 0.7324, 0.7324],
#         [0.0706, 0.0706, 0.0706],
#         ...,
  • В case A вы перезаписываете все элементы arr с помощью [1, 0, 1].
  • In case A2 вы сохраняете исходный массив на new_arr[:, :, 0] и заполняете остальные плоскости new_arr[:, :, 1:] some_numbers соответственно.
  • В case B и case C вы повторяете массив 100x100 3 раза вдоль новое третье измерение.
0 голосов
/ 11 марта 2020

Как я понял, вы хотите сгенерировать трехмерный массив:

  • первый «слой», заполненный единицами,
  • второй «слой», заполненный нулями,
  • третий «слой» снова заполнен единицами,
  • все «слои» с размером 100 * 100.

Для удобства чтения я изменил ваши предположения:

  • третий «слой», заполненный 2 ,
  • всеми «слоями» с размером 5 * 5.

Шаг 1 : Создайте каждый двумерный массив (слой в целевом массиве):

arr1 = np.ones((5,5), dtype=np.int)
arr2 = np.zeros((5,5), dtype=np.int)
arr3 = np.full((5,5), 2)

Шаг 2. Создайте целевой массив:

res = np.stack((arr1, arr2, arr3), axis=2)

При печати res.shape , вы получите:

(5, 5, 3)

(5 строк, 5 столбцов, 3 слоя)

Чтобы увидеть каждый «слой» отдельно, запустите res[:, :, n] где n это либо 0 , 1 или 2 . Например, за n == 2 (последний слой) я получил:

array([[2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...