小编典典

如何将二维数组复制到第三维,N次?

all

我想将一个 numpy 二维数组复制到第三维。例如,给定 2D numpy 数组:

import numpy as np

arr = np.array([[1, 2], [1, 2]])
# arr.shape = (2, 2)

将其转换为在新维度中具有 N 个此类副本的 3D 矩阵。作用于arrN=3输出应为:

new_arr = np.array([[[1, 2], [1,2]], 
                    [[1, 2], [1, 2]], 
                    [[1, 2], [1, 2]]])
# new_arr.shape = (3, 2, 2)

阅读 61

收藏
2022-08-20

共1个答案

小编典典

可能最干净的方法是使用np.repeat

a = np.array([[1, 2], [1, 2]])
print(a.shape)
# (2,  2)

# indexing with np.newaxis inserts a new 3rd dimension, which we then repeat the
# array along, (you can achieve the same effect by indexing with None, see below)
b = np.repeat(a[:, :, np.newaxis], 3, axis=2)

print(b.shape)
# (2, 2, 3)

print(b[:, :, 0])
# [[1 2]
#  [1 2]]

print(b[:, :, 1])
# [[1 2]
#  [1 2]]

print(b[:, :, 2])
# [[1 2]
#  [1 2]]

话虽如此,您通常可以通过使用广播来避免完全重复您的数组。例如,假设我想添加一个(3,)向量:

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

a. 我可以a在第三维中复制 3 次的内容,然后c在第一维和第二维中复制两次的内容,这样我的两个数组都是(2, 2, 3),然后计算它们的总和。但是,这样做更简单、更快捷:

d = a[..., None] + c[None, None, :]

在这里,a[..., None]有形状(2, 2, 1)c[None, None, :]有形状(1, 1, 3)*。当我计算总和时,结果会沿着尺寸 1 的尺寸“广播”出来,给我一个 shape 的结果(2, 2, 3)

print(d.shape)
# (2,  2, 3)

print(d[..., 0])    # a + c[0]
# [[2 3]
#  [2 3]]

print(d[..., 1])    # a + c[1]
# [[3 4]
#  [3 4]]

print(d[..., 2])    # a + c[2]
# [[4 5]
#  [4 5]]

广播是一种非常强大的技术,因为它避免了在内存中创建输入数组的重复副本所涉及的额外开销。


  • 尽管我为了清楚起见将它们包括在内,但实际上并不需要None索引- 您也可以这样做,即针对数组广播数组。这是因为如果其中一个数组的维数比另一个数组少,那么只有两个数组的 尾随 维数需要兼容。举一个更复杂的例子:c``a[..., None] + c``(2, 2, 1)``(3,) __

    a = np.ones((6, 1, 4, 3, 1)) # 6 x 1 x 4 x 3 x 1
    b = np.ones((5, 1, 3, 2)) # 5 x 1 x 3 x 2
    result = a + b # 6 x 5 x 4 x 3 x 2

2022-08-20