np.将 ND 张量/数组与一维数组连接起来

2023-12-10

我有两个数组a和b

a.shape
(5, 4, 3)
array([[[ 0.        ,  0.        ,  0.        ],
        [ 0.        ,  0.        ,  0.        ],
        [ 0.        ,  0.        ,  0.        ],
        [ 0.10772717,  0.604584  ,  0.41664413]],

       [[ 0.        ,  0.        ,  0.        ],
        [ 0.        ,  0.        ,  0.        ],
        [ 0.10772717,  0.604584  ,  0.41664413],
        [ 0.95879616,  0.85575133,  0.46135877]],

       [[ 0.        ,  0.        ,  0.        ],
        [ 0.10772717,  0.604584  ,  0.41664413],
        [ 0.95879616,  0.85575133,  0.46135877],
        [ 0.70442301,  0.74126523,  0.88965603]],

       [[ 0.10772717,  0.604584  ,  0.41664413],
        [ 0.95879616,  0.85575133,  0.46135877],
        [ 0.70442301,  0.74126523,  0.88965603],
        [ 0.8039435 ,  0.62802183,  0.58885027]],

       [[ 0.95879616,  0.85575133,  0.46135877],
        [ 0.70442301,  0.74126523,  0.88965603],
        [ 0.8039435 ,  0.62802183,  0.58885027],
        [ 0.95848603,  0.72429311,  0.71461332]]])

and b

array([ 0.79212707,  0.66629398,  0.58676553], dtype=float32)
b.shape
(3,)

我想获取数组

ab.shape
(5,5,3)

我做如下 第一的

b = b.reshape(1,1,3)

then

b=np.concatenate((b, b,b, b, b), axis = 0)

And

ab=np.concatenate((a, b), axis = 1)
ab.shape
(5, 5, 3)

我得到了正确的结果,但不是很方便,尤其是在步骤上

b=np.concatenate((b, b,b, b, b), axis = 0)

当我必须多次输入时(真实数据集有很多维度)。有没有更快的方法可以得到这个结果?


简单的广播b to 3D然后沿着第二个轴连接 -

b3D = np.broadcast_to(b,(a.shape[0],1,len(b)))
out = np.concatenate((a,b3D),axis=1)

The broadcastingnp.broadcast_to并不实际复制或制作副本,而只是一个复制视图,然后在下一步中,我们进行串联以即时进行复制。

标杆管理

我们正在比较np.repeat来自 @cᴏʟᴅsᴘᴇᴇᴅ 解决方案的版本反对np.broadcast_to一 本节重点关注性能。基于广播的在第二步中进行复制和串联,作为合并命令可以这么说,同时np.repeatversion 进行复制,然后在两个单独的步骤中连接。

整个方法的计时:

情况1 :a = (500,400,300) and b = (300,)

In [321]: a = np.random.rand(500,400,300)

In [322]: b = np.random.rand(300)

In [323]: %%timeit
     ...: b3D = b.reshape(1, 1, -1).repeat(a.shape[0], axis=0)
     ...: r = np.concatenate((a, b3D), axis=1)
10 loops, best of 3: 72.1 ms per loop

In [325]: %%timeit
     ...: b3D = np.broadcast_to(b,(a.shape[0],1,len(b)))
     ...: out = np.concatenate((a,b3D),axis=1)
10 loops, best of 3: 72.5 ms per loop

对于较小的输入形状,请致电np.broadcast_to需要的时间比np.repeat鉴于设置广播所需的工作显然更加复杂,如下所示:

In [360]: a = np.random.rand(5,4,3)

In [361]: b = np.random.rand(3)

In [366]: %timeit np.broadcast_to(b,(a.shape[0],1,len(b)))
100000 loops, best of 3: 3.12 µs per loop

In [367]: %timeit b.reshape(1, 1, -1).repeat(a.shape[0], axis=0)
1000000 loops, best of 3: 957 ns per loop

但是,无论输入的形状如何,广播部分都将具有恒定的时间,即这3 u-sec部分将停留在该标记附近。对方的时间安排:b.reshape(1, 1, -1).repeat(a.shape[0], axis=0)取决于输入形状。因此,让我们更深入地研究一下这两种方法的串联步骤如何公平/行为。

深层发掘

尝试深入挖掘以了解串联部分消耗了多少:

In [353]: a = np.random.rand(500,400,300)

In [354]: b = np.random.rand(300)

In [355]: b3D = np.broadcast_to(b,(a.shape[0],1,len(b)))

In [356]: %timeit np.concatenate((a,b3D),axis=1)
10 loops, best of 3: 72 ms per loop

In [357]: b3D = b.reshape(1, 1, -1).repeat(a.shape[0], axis=0)

In [358]: %timeit np.concatenate((a,b3D),axis=1)
10 loops, best of 3: 72 ms per loop

结论:看起来并没有太大不同。

现在,让我们尝试一个需要复制的情况b是一个更大的数字并且b元素数量也非常多。

In [344]: a = np.random.rand(10000, 10, 1000)

In [345]: b = np.random.rand(1000)

In [346]: b3D = np.broadcast_to(b,(a.shape[0],1,len(b)))

In [347]: %timeit np.concatenate((a,b3D),axis=1)
10 loops, best of 3: 130 ms per loop

In [348]: b3D = b.reshape(1, 1, -1).repeat(a.shape[0], axis=0)

In [349]: %timeit np.concatenate((a,b3D),axis=1)
10 loops, best of 3: 141 ms per loop

结论:看起来像是合并的连接+复制np.broadcast_to这里做得好一些。

我们来尝试一下原来的情况(5,4,3) shape :

In [360]: a = np.random.rand(5,4,3)

In [361]: b = np.random.rand(3)

In [362]: b3D = np.broadcast_to(b,(a.shape[0],1,len(b)))

In [363]: %timeit np.concatenate((a,b3D),axis=1)
1000000 loops, best of 3: 948 ns per loop

In [364]: b3D = b.reshape(1, 1, -1).repeat(a.shape[0], axis=0)

In [365]: %timeit np.concatenate((a,b3D),axis=1)
1000000 loops, best of 3: 950 ns per loop

结论:同样,没有太大不同。

所以,最终的结论是,如果里面有很多元素b如果第一个轴a也是一个很大的数字(因为复制数就是那个),np.broadcast_to将是一个不错的选择,否则np.repeat基于版本很好地处理了其他情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

np.将 ND 张量/数组与一维数组连接起来 的相关文章

随机推荐

  • Firefox 上的 event.target

    var x event target event srcElement document getElementById x id style left 200 px document getElementById x id style to
  • 创建项目后更改视图引擎

    我在asp net mvc4中创建了一个项目并将其视图引擎设置为ASPX 现在 我想将 View Engine 更改为 Razor 怎么做 我不想创建一个新项目 我想使用现有项目来更改视图引擎 我们可以从属性或其他方式更改视图引擎吗 应该像
  • 处理塔防游戏 - 塔攻击敌人

    我会保持简短 我正在制作一个塔防游戏作为一个迷你项目 同时我有一些空闲时间 我正在尝试弄清楚如何实现塔 以便能够在敌人进入射程时使用 dist 射击敌人但我只是不知道如何实现使用敌人位置和塔位置的方法 我有一个 CreepSprites 和
  • 如何防止Chrome在自动填充用户名/密码时更改字体?

    我有一个包含用户名和密码输入的登录表单 在 Windows 上的 Chrome 中 在其他浏览器或 Mac 上不会发生这种情况 当将鼠标悬停在 Chrome 密码管理器中保存的用户名上时 字体会发生变化 字体的变化然后改变了输入的宽度 使我
  • dataTableOutput 顶部和底部的空“row-fluid”div

    我有一个使用 renderDataTable 创建输出的闪亮示例 我删除了所有可能的选项 分页 过滤 搜索等 但是 现在我的表输出的顶部和底部有一个空白行 以前是过滤和搜索的地方 仅当我删除了过滤和搜索选项时 如何从数据表包装器内部删除这两
  • 什么是 Mocha 平等测试?

    我正在使用 Mocha 测试 Express Node 应用程序 我想要进行以下测试 比较两个空数组 assert equal 通过 但是 Mocha 给了我以下错误 AssertionError 我应该使用哪种方法才能通过两个空数组的比较
  • ncurses 和 stdin 阻塞

    I have stdin in a select set and I want to take a string from stdin whenever the user types it and hits Enter But select
  • 是否可以“等待yield return DoSomethingAsync()”

    常规迭代器块 即 yield return 与 async 和 await 不兼容吗 这很好地说明了我正在尝试做的事情 async Task
  • Web 服务代理中的 SSL 证书问题

    我正在构建一个 JAVA Web 服务客户端 在其中连接到服务 该服务具有 ssl 证书验证 如何使用 ssl 证书验证来调用此服务 我在使用 Eclipse 构建的客户端中使用 JAX RPC 实现 举个例子将不胜感激 我能够进行网络服务
  • 如何在删除前在php中添加确认框?

    我在 PHP 中创建一个简单的列表 用户可以在其中添加姓名 年龄 电子邮件等 我还添加了一个删除选项 但我想在用户单击删除选项时添加一条确认消息 我尝试搜索 Google 但只找到了 jQuery 和 JavaScript 解决方案 有没有
  • 将一个 JSONAray 项目转换为多个项目

    我有以下字符串 它以列表的形式从数据库返回 我的假设是 该列表包含 3 个项目 但它只显示 1 作为大小 因此它将所有活动项作为一个元素返回 注意 当我尝试获取列表的第一个索引 list get 0 时 它仅返回一个 活动 而不是所有三个
  • 为什么下载 pdf 文档而不是在嵌入/iframe 中显示?

    我们有一个内部网站 其中有一些指向网络服务器上托管的 pdf 文档的链接 如果我打开 Chrome 开发工具 F12 检查链接并添加具有相同 pdf 文档的嵌入 它会下载该文件而不是显示它 我尝试过使用 embed 和 iframe 但仍然
  • 帮助使用 JCheckBox 制作 JTree

    我有一个不寻常的情况 我需要一个 JTree 每个节点包含 2 个复选框和一个标签 能够添加一个侦听器来告知何时选中任何潜在的复选框 我还需要根节点具有相同的布局 我假设这意味着创建一个带有 2 个 JCheckBox 和一个 JLabel
  • 分离类模板中的参数包

    我正在尝试编写一个使用参数包并为参数包中包含的每种类型实现成员函数的类模板 这是我到目前为止所拥有的 template
  • 使用 CAAnimation 启用用户交互?

    使用基于块的动画的选项字段制作动画时 允许用户与视图交互非常容易 但在我的程序中 我使用的是 CAKeyframeAnimation 并且没有看到任何用于设置启用用户交互的属性 有什么办法可以做到这一点吗 Thanks 编辑 这是实际的代码
  • 从哈希中提取值

    您好 我使用 HTTParty 调用远程 json 文件 我需要提取 URL 以在我的一项测试中使用 json 格式类似于 manifest header generated xxxxxxxxxxxxxxx name xxxxxxxxxxx
  • 如何在点击下拉菜单时制作CSS下拉菜单

    如何让下面的css下拉菜单只接受点击下拉 例如 现在当鼠标悬停 请选择 时 第二层出现 我想更改为当单击 请选择 时 出现第二层 另外 点击事件应该应用于第二层菜单 这是一个Fiddle 我正在使用 jquery 但不知道如何执行此操作 h
  • localhost 或 127.0.0.1 的第三方签名 SSL 证书?

    在不透露太多信息的情况下 我需要设置一个网络服务器系统 供互联网上的最终用户使用 用例是这样的 连接到系统时 最终用户 通常 在家中位于本地防火墙后面 该系统由我们托管的远程服务器组成 严格通过 https 使用 SSL 授权机制要求用户在
  • 为什么将字符串铲入哈希会导致这个结果? [复制]

    这个问题在这里已经有答案了 我正在研究 Ruby Koans 以便更好地掌握 Ruby 和 TDD 我到达代码中的第 93 行about hashes rb这让我很困惑如何将其铲入默认构造函数而不是哈希值中 出于好奇 我尝试使用相同的字符串
  • np.将 ND 张量/数组与一维数组连接起来

    我有两个数组a和b a shape 5 4 3 array 0 0 0 0 0 0 0 0 0 0 10772717 0 604584 0 41664413 0 0 0 0 0 0 0 10772717 0 604584