разверните и скопируйте массив 1D numpy в 3D - PullRequest
1 голос
/ 03 февраля 2020

У меня есть 1D массив, который мне нужно расширить в 3D, с исходным массивом, скопированным в axis=0.

В настоящее время у меня есть такая установка:

import numpy as np

x = np.array((1, 2, 3, 4, 5))
y = np.zeros((len(x), 5, 5))

for i in range(5):
  for j in range(5):
    y[:, i, j] = x

print(y)

[[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[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.]]

 [[3. 3. 3. 3. 3.]
  [3. 3. 3. 3. 3.]
  [3. 3. 3. 3. 3.]
  [3. 3. 3. 3. 3.]
  [3. 3. 3. 3. 3.]]

 [[4. 4. 4. 4. 4.]
  [4. 4. 4. 4. 4.]
  [4. 4. 4. 4. 4.]
  [4. 4. 4. 4. 4.]
  [4. 4. 4. 4. 4.]]

 [[5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]]]

Мне кажется, что должен быть более простой способ сделать это, чем с помощью вложенных циклов for, но все, что появляется при беглом поиске, показывает, как разрезать длинный массив 1D и сделать его трехмерным, но не копировать исходный измерение в 2 больше измерений.

1 Ответ

2 голосов
/ 03 февраля 2020

У вас есть несколько вариантов. Вы можете сделать это с np.tile следующим образом:

y = np.tile(x[:, np.newaxis, np.newaxis], (1, 5, 5))

Это даст вам новый непрерывный массив с нужным вам содержимым. Однако, если вам не нужно записывать в результирующий массив, вы можете использовать np.broadcast_to, чтобы сделать массив массива только для чтения с новой формой, сэкономив вам память для создания большего массив:

y = np.broadcast_to(x[:, np.newaxis, np.newaxis], (5, 5, 5))

Обратите внимание, что, поскольку это представление, в этом случае изменение значения в x приведет к изменению значений в y.

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