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

标签 list wolfram-mathematica

在 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/

相关文章:

wolfram-mathematica - 使用可选值定义一个函数,默认情况下该函数是 mathematica 中函数的另一个参数的函数

wolfram-mathematica - 提高(或替代)RegionPlot 的速度

wolfram-mathematica - Mathematica中是否有类似于Maple的 "lhs"和 "rhs"函数?

list - Cons 单元格指向相同的其他 cons

java - List.toArray(T[]) 的奇怪泛型行为

c# - 确保列表中的每个项目都是唯一的?

python - 有时在 python 和 mathematica 中计算的特征向量有相反的符号有人知道为什么吗?

c# - 如何仅从列表中获取特定字段

python - 使用索引条件对列表元素求和

wolfram-mathematica - 防止对 Mathematica 表达式求值