根据 Mathematica 中的另一个列表值拆分列表

2024-05-11

在 Mathematica 中我有一个点坐标列表

size = 50;
points = Table[{RandomInteger[{0, size}], RandomInteger[{0, size}]}, {i, 1, n}];

以及这些点所属的聚类索引列表

clusterIndices = {1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1};

根据 clusterIndices 值将点分成两个单独的列表的最简单方法是什么?

编辑: 我想出的解决方案:

pointIndices =
  Map[#[[2]] &,
    GatherBy[MapIndexed[{#1, #2[[1]]} &, clusterIndices], First],
    {2}];
pointsByCluster = Map[Part[points, #] &, pointIndices];

有更好的方法吗?


正如@High Performance Mark 和@Nicholas Wilson 所说,我首先通过以下方式将两个列表组合在一起Transpose or Thread。在这种情况下,

In[1]:= Transpose[{clusterIndices, points}]==Thread[{clusterIndices, points}]
Out[1]:= True

有一次,我看了一下哪个更快,我想Thread稍微快一些。但是,只有当您使用很长的列表时,它才真正重要。

@High Performance Mark 提出了很好的建议Select。但是,它一次只允许您拉出一个集群。选择簇1的代码如下:

Select[Transpose[{clusterIndices, points}], #[[1]]==1& ][[All, All, 2]]

由于您似乎想要生成所有集群,因此我建议执行以下操作:

GatherBy[Transpose[{clusterIndices, points}], #[[1]]& ][[All, All, 2]]

它的优点是作为一个衬垫,唯一棘手的部分是选择正确的Part结果列表中。确定多少的技巧All条款是必要的,需要注意的是

Transpose[{clusterIndices, points}][[All,2]]

需要将点从转置列表中取出。但是,“聚集”列表还有一个附加级别,因此是第二个All.

需要注意的是,第二个参数GatherBy是一个接受一个参数的函数,它可以与您想要使用的任何函数互换。因此,它非常有用。但是,如果您想在收集数据时转换数据,我会看看Reap and Sow.

Edit: Reap and Sow有点未被充分利用,但相当强大。它们使用起来有点令人困惑,但我怀疑GatherBy是在内部使用它们来实现的。例如,

Reap[ Sow[#[[2]], #[[1]] ]& /@ Transpose[{clusterIndices, points}], _, #2& ]

与我之前的代码执行相同的操作,而无需从点中删除索引。本质上,Sow用索引标记每个点,然后 Reap 收集所有标签(_对于第二个参数)并仅输出点。就我个人而言,我使用它而不是 GatherBy,并将其编码到我加载的函数中,如下所示:

SelectEquivalents[x_List,f_:Identity, g_:Identity, h_:(#2&)]:=
   Reap[Sow[g[#],{f[#]}]&/@x, _, h][[2]];

注意:此代码是 5.x 中帮助文件中内容的修改形式。但是,6.0 和 7.0 帮助文件删除了很多有用的示例,这就是其中之一。

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

根据 Mathematica 中的另一个列表值拆分列表 的相关文章

随机推荐

  • 需要初学者 PHP 帮助

    我学习 PHP 一段时间了 我想要一个澄清 我见过preg match使用不同的分隔符号调用函数 例如 preg match and preg match 今天我还看到了 正在使用 我的问题分为两部分 所有字符都可以使用什么 有一个标准吗
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • PHP 中可以动态添加数据成员吗?

    我想知道是否可以在 PHP 运行时添加新的类数据成员 Yes prop newname obj gt prop 42 会做同样的事情 obj gt newname 42 如果 obj 尚不存在 则任一者都会将 newname 添加为属性
  • 选择 jQuery 中的每第 n 个项目?

    jQuery 有方便的 even 和 odd 选择器 用于选择集合中偶数或奇数索引的项目 我用它来清除一系列浮动框中的所有其他项目 如下所示 div class 2up div div div div div div div and Cle
  • Django - 该进程无法访问该文件,因为该文件正在被另一个进程使用

    我正在尝试在 Windows 10 上运行 Django 我是 Django 的新手 我正在使用 Compressor Toolkit 我的问题是 我可以运行 manage py 但本地主机说 base html 第 9 行出错该进程无法访
  • React i18next languageChanged 事件被多次调用

    我在我的 React js 应用程序中使用 i18next 进行翻译 我在 Header jsx 文件中添加了所有页面通用的语言下拉列表 我正在根据其中一个页面中的当前语言获取数据quiz jsx 因此 在语言更改时应该再次调用 api 问
  • git push origin 分支名总是推送到 master

    我搜索了一下 但似乎找不到答案 在我可以访问的两个盒子上 当我执行 git push dry run origin mytestbranch 时 我得到以下结果 To email protected cdn cgi l email prot
  • setOnTouchListener() 给我一个错误

    button setOnTouchListener new OnTouchListener public void onClick View v Toast makeText MainActivity this YOUR TEXT 5000
  • 在 JUnit 测试中读取资源文件

    我在单元测试中读取文本文件 并将一些输入文本文件放置在资源文件夹中 以下是目录结构 src gt com gt au gt myapp gt util gt MyFileReader 测试 gt com gt au gt myapp gt
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 测试 Hessian remoting-servlet.xml

    我们使用 Hessian 来实现富客户端和服务器之间的通信 由于移动和重命名 remoting servlet xml 中的条目有时会与实际的类名不匹配 因此 我正在寻找一种简单的方法来测试远程处理 xml 有没有简单的方法可以做到这一点
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • spring-boot-autoconfigure-processor 的目的?

    目的是什么 annotationProcessor org springframework boot spring boot autoconfigure processor 无论有没有它 我的应用程序都可以正常工作 我创建的薄罐子在依赖项目
  • 从 Xcode iOS 项目运行 swift 脚本作为构建阶段

    这是一个简单的快速脚本 usr bin env xcrun swift import Foundation let task NSTask task launchPath bin echo task arguments farg1 arg2
  • 我可以更改导航栏项目的位置吗?

    Here is the snapshot 代码在这里 UIButton leftButton UIButton buttonWithType UIButtonTypeCustom leftButton frame CGRectMake 0
  • 如何自定义 JFrame 上的标题栏?

    我想在我的 Java Swing 桌面应用程序中拥有一个自定义的标题栏 最好的方法是什么 我可以通过在 JFrame 的构造函数中使用以下代码来使用 Swing 标题栏 this setUndecorated true this getRo
  • 该表达式的类型为 int,但此处与 unit 类型一起使用

    我试图在 F 中获得与此 vb net 代码完全相同的 非功能性的 Function FastPow ByVal num As Double ByVal exp As Integer As Double Dim res As Double
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 在 Jest 测试中设置时刻时区

    我有 util 函数 它以特定的日期格式解析给定的日期 即 2019 01 28 然后使用momentJS检索当天的开始并将其转换为 ISO 日期格式 dates js import moment from moment export co
  • 根据 Mathematica 中的另一个列表值拆分列表

    在 Mathematica 中我有一个点坐标列表 size 50 points Table RandomInteger 0 size RandomInteger 0 size i 1 n 以及这些点所属的聚类索引列表 clusterIndi