如何从 1 维数组创建 3 维数组?

问题描述 投票:0回答:2

假设我有一个一维数组

a = np.array([1, 2, 3])

从 a 获取形状为 (3, 4, 5) 的数组 b 的最佳方法是什么?数组 a 的每个值都用于初始化一个 4x5 数组,堆叠所有这些数组将创建数组 b。我想知道是否可以避免循环创建数组 b。

b = np.array([[[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]], [[3, 3, 3, 3, 3], [3, 3, 3, 3, 3], [3, 3, 3, 3, 3], [3, 3, 3, 3, 3]]])

b 的输出:

array([[[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]],
   [[3, 3, 3, 3, 3],
    [3, 3, 3, 3, 3],
    [3, 3, 3, 3, 3],
    [3, 3, 3, 3, 3]]])
python numpy numpy-ndarray array-broadcasting
2个回答
1
投票

使用

numpy.tile

b = np.tile(a[:, None, None], (1, 4, 5))

输出:

array([[[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]],

       [[3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3]]])

0
投票

您可以通过创建一个数组并将其乘以

a[:,None,None]
来使用广播来实现。

import numpy as np

a = np.array([1, 2, 3])
b = np.ones((3,4,5), dtype=int)*a[:,None,None]

您也可以在不使用

np.broadcast_to
创建数组的情况下执行此操作。

import numpy as np

a = np.array([1, 2, 3])
b = np.broadcast_to(a[:,None,None], (3,4,5))
© www.soinside.com 2019 - 2024. All rights reserved.