将一个numpy的2D数组复制到第三维。例如,给定(2D)numpy数组:
import numpy as np arr = np.array([[1,2],[1,2]])
将其转换为3D矩阵,并在新维度中包含N个此类副本。作用于arr与N = 3时,输出应为:
new_arr = np.array([[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]])
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
也许最干净的方法是使用np.repeat:
a = np.array([[1, 2], [1, 2]]) print(a.shape)
b = np.repeat(a[:, :, np.newaxis], 3, axis=2)
print(b.shape)
print(b[:, :, 0])
print(b[:, :, 1])
print(b[:, :, 2])
话虽如此,您通常可以通过使用broadcast避免完全重复阵列。例如,假设我要添加一个(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)
print(d[..., 0]) # a + c[0]
print(d[..., 1]) # a + c[1]
print(d[..., 2]) # a + c[2]
广播是一项非常强大的技术,因为它避免了在内存中创建输入数组的重复副本所涉及的额外开销。
*尽管为清楚起见,我将它们包括在内,但实际上并不需要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