Mathematica是否有与Matlab的“unique”函数等效的函数?

7
有没有一个Mathematica函数可以提供与MATLAB中的unique()函数相同的结果?我意识到我可以使用Union[]函数来获取列表的唯一元素,但我想要类似于该函数的三个结果版本的东西,该版本提供了将输入数组和唯一值数组之间进行映射的索引数组。
如果没有内置的功能,是否有可用的该函数实现?这里有人知道如何构建它吗?
3个回答

8

您可以利用Mathematica的Position[]自行构建类似的功能。例如,给定一组数字,您可以执行以下操作:

In[1] := A = {1, 5, 2, 3, 7, 3, 2, 8, 6, 5, 9, 2, 1};
In[2] := {#, Flatten[Position[A, #]]} & /@ Union[A]
Out[2]:= {{1, {1, 13}}, {2, {3, 7, 12}}, {3, {4, 6}}, {5, {2, 10}}, {6, {9}}, {7, {5}}, {8, {8}}, {9, {11}}}

获取唯一元素列表以及它们在原始列表中出现的索引。 为了完全复制Matlab的Unique()功能,特别是针对IT技术相关内容。

[b,m,n] = unique(A)

you need

b = Union[A];
m = Last[Position[A, #]] & /@ b // Flatten;
n = Position[b, #] & /@ A // Flatten;

现在提供所需的行为

In[1] := A[[#]] & /@ m == b
Out[1]:= True

In[2] := b[[#]] & /@ n == A
Out[2]:= True

这正是我正在寻找的。我已经忘记了Position[],在浏览文档时没有再次找到它。感谢您的帮助! - clartaq
1
需要考虑的一件事是 Union 会对输入列表进行排序。如果不希望发生这种情况,请使用 DeleteDuplicates。针对大输入,DeleteDuplicates 通常也更快。 - Pillsy
谢谢你的建议,我需要进行一些测试,但这可能会是我的一个项目中的一个很好的改进。 - Timo

2
有一个简单的方法:
a={1,2,3,4,5,5,5,4,3,2}

  {1,2,3,4,5,5,5,4,3,2}

uniques = DeleteDuplicates[a]

  {1,2,3,4,5}

1
尝试使用 Length [Union [x]] 。如果x = [1,0,1,1,1],则会得到 Length [Union [x]] = 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接