迭代 numpy 数组列的所有成对组合

2023-11-23

我有一个大小为 numpy 的数组

arr.size = (200, 600, 20). 

我想计算scipy.stats.kendalltau在最后两个维度的每个成对组合上。例如:

kendalltau(arr[:, 0, 0], arr[:, 1, 0])
kendalltau(arr[:, 0, 0], arr[:, 1, 1])
kendalltau(arr[:, 0, 0], arr[:, 1, 2])
...
kendalltau(arr[:, 0, 0], arr[:, 2, 0])
kendalltau(arr[:, 0, 0], arr[:, 2, 1])
kendalltau(arr[:, 0, 0], arr[:, 2, 2])
...
...
kendalltau(arr[:, 598, 20], arr[:, 599, 20])

这样我就涵盖了所有组合arr[:, i, xi] with arr[:, j, xj] with i < j and xi in [0,20), xj in [0, 20)。这是(600 choose 2) * 400单独计算,但由于每个都需要大约0.002 s在我的机器上,使用多处理模块不会花费超过一天的时间。

迭代这些列的最佳方法是什么(使用i<j)?我想我应该避免类似的事情

for i in range(600):
    for j in range(i+1, 600):
        for xi in range(20):
            for xj in range(20):

做到这一点最数字化的方法是什么?

Edit:我更改了标题,因为肯德尔·陶 (Kendall Tau) 对这个问题来说并不重要。我意识到我也可以做类似的事情

import itertools as it
for i, j in it.combinations(xrange(600), 2):
    for xi, xj in product(xrange(20), xrange(20)):

但 numpy 必须有一种更好、更矢量化的方法。


对此类内容进行矢量化的一般方法是使用广播来创建集合与其自身的笛卡尔积。在你的情况下你有一个数组arr形状的(200, 600, 20),所以你会对它有两种看法:

arr_x = arr[:, :, np.newaxis, np.newaxis, :] # shape (200, 600, 1, 1, 20)
arr_y = arr[np.newaxis, np.newaxis, :, :, :] # shape (1, 1, 200, 600, 20)

为了清楚起见,上面两行已被扩展,但我通常会编写等效的内容:

arr_x = arr[:, :, None, None]
arr_y = arr

如果你有一个向量化函数,f,在除最后一个维度之外的所有维度上进行广播,然后您可以执行以下操作:

out = f(arr[:, :, None, None], arr)

进而out将是一个形状数组(200, 600, 200, 600), with out[i, j, k, l]持有的价值f(arr[i, j], arr[k, l])。例如,如果您想计算所有成对内积,您可以这样做:

from numpy.core.umath_tests import inner1d

out = inner1d(arr[:, :, None, None], arr)

很遗憾scipy.stats.kendalltau不是这样矢量化的。根据the docs

“如果数组不是一维的,它们将被展平为一维。”

所以你不能像这样去做,你最终会做 Python 嵌套循环,无论是显式地写出来,使用itertools或将其隐藏在np.vectorize。这会很慢,因为对 Python 变量进行迭代,并且每个迭代步骤都有一个 Python 函数,这都是昂贵的操作。

请注意,当您可以采用矢量化方式时,有一个明显的缺点:如果您的函数是可交换的,即如果f(a, b) == f(b, a),那么您将执行所需计算的两倍。根据实际计算的成本,这通常会被没有任何 Python 循环或函数调用的速度增加所抵消。

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

迭代 numpy 数组列的所有成对组合 的相关文章

随机推荐

  • 反向代理背后的 HTTP/2

    到目前为止 所有教程都告诉我 我需要在服务器上启用 SSL 才能支持 HTTP 2 在给定的场景中 我们在后端 Tomcat Jetty 服务器前面有 nginx 尽管从性能角度考虑值得在后端启用 HTTP 2 但在那里也拥有 HTTPS
  • HTTP GET 和 POST 参数建议

    发出以下 POST 请求是否是不好的做法 test a 1 b 2 POST data c 3 d 4 请注意 2 个参数是 URL 的一部分 2 个参数是 POST 内容的一部分 另一方面 仍然建议遵循以下规则 GET 请求 从中检索内容
  • Tensorflow:对小批量中的每个样本使用不同过滤器进行卷积

    我想要一个带有过滤器的二维卷积 该过滤器取决于张量流中小批量中的样本 有什么想法可以做到这一点 特别是在每个小批量的样本数量未知的情况下 具体来说 我有输入数据inp形式的MB x H x W x Channels 我有过滤器F形式的MB
  • 是否可以从 C# 中调用用户定义(自定义)R 函数?

    是否可以从 C 中调用用户定义 自定义 R 函数 例如 用 R 编写的简单矩阵乘法函数 matrix mult function a b c a b return c 我怎样才能从c 调用这个R函数matrix mult a b 经过一番研
  • 将浮雕添加到navigationItem.titleView中的UILabel(如navigationItem.title所示)

    我试图模仿自动应用于 navigationItem title 以及许多其他 UIKit 控件的默认浮雕 如该屏幕截图的标题 表格单元格 所示 source quicksnapper com 我本质上是想向 navigationItem t
  • HttpContext 和 SignalR HubCallerContext 之间的统一静态类

    我有很多依赖于 HttpContext Current 的代码 我注意到来自 SignalR 集线器的请求HttpContext Current null 所以我的代码中断了 例如 HttpContext Current Request I
  • 为远程托管的 SQL Server 定义连接字符串

    目前我有以下内容
  • C# 将一个目录与另一个目录合并

    我有一个自动更新程序 C 程序 它将下载一个 rar 文件 其中包含用于更新某些软件的更改或新文件 rar 文件的结构与软件的基本目录类似 但仅包含已更改或新的文件 文件夹 有没有一种简单的方法可以将这些文件 文件夹 合并 到目标目录 这样
  • CruiseControl.NET 电子邮件发布者问题

    我想将 ccnet 设置为 每次构建后向提交者发送邮件 无论状态如何 当构建中断或修复时 向所有其他开发人员发送邮件 随着 CCNet 的每个新版本 电子邮件发布者都会被重构 并且据说有所改进 但我仍然遇到同样的问题 只有提交者会收到通知
  • 投影 topojson 的方法?

    给定一个形状文件 自然地球 ne 10m admin 0 sovereignty zip 鉴于我们想要将其重新投影为 D3js 数据可视化 我们可以在不同级别重新投影 1 获取重新投影的形状文件 1 使用ogr2ogr ogr2ogr f
  • dockerize 一个 wpf 应用程序并使用它

    我正在尝试对 wpf 应用程序进行 dockerize 当时只是一个简单的应用程序 现在我得到了这个 dockerfile FROM microsoft nanoserver WORKDIR C run PATH ENTRYPOINT C
  • 如何在WinForms中制作ownerdraw Trackbar

    我正在尝试制作一个带有滑块拇指自定义图形的轨迹栏 我从以下代码开始 namespace testapp partial class MyTrackBar System Windows Forms TrackBar public MyTrac
  • PHP 确定多个(n)日期时间范围何时相互重叠

    我正在努力解决以下问题 这是一个日历程序 给定多个人的一组可用日期时间集 我需要找出每个人在 PHP 中可用的日期时间范围 可用性集 p1 start 2016 04 30 12 00 end 2016 05 01 03 00 p2 sta
  • 如何检测用户的区域设置以获得正确的 csv 分隔符?

    我有一个简单的数据转换工具 它可以生成的输出之一是 csv 文件 这在英国非常有效 但当我将其运送给德国客户时 我遇到了一些问题 具体来说 他们使用 表示浮点数中的小数点 反之亦然 这意味着当他们在 Excel 中打开数据文件时 结果至少可
  • 如何使用四开同时编织两种格式?

    是否可以通过在 YAML 标头中指定来一次从 Quarto R Markdown 文档创建多种输出格式 我的猜测没有成功 title Stacked Area chart with Annotations format html gfm 尝
  • jqGrid - rowObject 不一致?

    带有 jqgrid rowObject 的第一页结果返回预期数据 但随后返回后续结果页的不完整数据 为什么 结果第一页 rowObject 3 将等于 2 结果的后续页面 rowObject 3 将等于 未定义 并且返回结果的第一页现在也将
  • 可选参数和继承

    我了解可选参数 并且非常喜欢它们 但我想更多地了解如何将它们与继承的接口一起使用 附件A interface IMyInterface string Get string Get string str class MyClass IMyIn
  • Amazon API Gateway:通过 Postman 调用 API 时,响应正文未转换?

    通过 AWS API Gateway 控制台执行测试时 我发现 Lambda 函数的输出响应已正确转换 type message request id 请参阅下面的日志 Tue Sep 06 14 46 06 UTC 2016 Endpoi
  • 删除R中的冗余列[重复]

    这个问题在这里已经有答案了 我有类似的东西 date pgm in x logs out y 20130514 na 12 j1 12 20131204 z2 03 j1 03 20130516 a01 04 j0 04 20130628
  • 迭代 numpy 数组列的所有成对组合

    我有一个大小为 numpy 的数组 arr size 200 600 20 我想计算scipy stats kendalltau在最后两个维度的每个成对组合上 例如 kendalltau arr 0 0 arr 1 0 kendalltau