gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:08:34 27 4
gpt4 key购买 nike

在 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 将这两个列表组合在一起。或 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中的第二个参数是一个接受一个参数的函数,它可以与您希望使用的任何函数互换。因此,它非常有用。但是,如果您想在收集数据时转换数据,我会查看 ReapSow .

编辑: ReapSow有点使用不足,而且相当强大。它们使用起来有些困惑,但我怀疑 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 的帮助文件删除了很多有用的示例,这就是其中之一。

关于list - 根据 Mathematica 中的另一个列表值拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com