栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将2D数组复制到3维,N次(Python)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将2D数组复制到3维,N次(Python)

也许最干净的方法是使用

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

话虽如此,您通常可以通过使用broadcast避免完全重复阵列。例如,假设我要添加一个

(3,)
向量:

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

a
。我可以
a
在第三维中复制3次的内容,然后
c
在第一维和第二维中复制2次的内容,这样我的两个数组都是
(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 1b = np.ones((5, 1, 3, 2))     #     5 x 1 x 3 x 2result = a + b     # 6 x 5 x 4 x 3 x 2


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637034.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号