将 1D numpy 数组展开并复制到 3D

lst*_*ger 3 python numpy

我有一个 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.]]]
Run Code Online (Sandbox Code Playgroud)

让我震惊的是,应该有一种比嵌套for循环更简单的方法来做到这一点,但是粗略搜索显示的任何内容都显示了如何切割长的一维数组并将其变为 3D,但不将初始维度复制到另外 2 个维度方面。

jde*_*esa 6

你有几个选择。np.tile你可以这样做:

y = np.tile(x[:, np.newaxis, np.newaxis], (1, 5, 5))
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个包含所需内容的新连续数组。但是,如果您不需要写入结果数组,则可以使用np.broadcast_to新形状创建数组的只读视图,从而节省实际创建更大数组的内存:

y = np.broadcast_to(x[:, np.newaxis, np.newaxis], (5, 5, 5))
Run Code Online (Sandbox Code Playgroud)

请注意,由于这是一个视图,因此在这种情况下更改 中的值x将会更改 中的值y