我该如何在Python中使用MATLAB中的unique(a, 'rows')函数?

9

我正在将一些MATLAB代码翻译成Python语言。

NumPy中有一个unique(a)命令。但由于MATLAB程序还运行了“rows”命令,因此它会给出略微不同的结果。

在Python中是否有类似的命令,或者我需要编写一个执行相同操作的算法?


4
你看过这个网页吗?http://mail.scipy.org/pipermail/numpy-discussion/2009-August/044664.html - Amro
是的,我看到了,但是没有unique1d这样的命令。我认为他们在新的Numpy中将其删除了,不过我不确定。 - Rodrigo Forti
4
尝试使用unique代替unique1d——那个帖子里的例子应该可以工作。 - ars
2个回答

5

假设您的二维数组按照通常的C顺序存储(也就是说,每一行在主数组中被视为一个数组或列表;换句话说,按行优先的顺序),或者您事先对数组进行转置,那么您可以像这样做...

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [2, 3, 4], [1, 2, 3], [3, 4, 5]])
>>> a
array([[1, 2, 3],
       [2, 3, 4],
       [1, 2, 3],
       [3, 4, 5]])
>>> np.array([np.array(x) for x in set(tuple(x) for x in a)]) # or "list(x) for x in set[...]"
array([[3, 4, 5],
       [2, 3, 4],
       [1, 2, 3]])

当然,如果您需要按照原始顺序获取唯一行,则这种方法不起作用。
顺便说一下,要模拟类似于unique(a, 'columns')的操作,只需转置原始数组,执行上述步骤,然后再次转置。

1
你可以尝试:
ii = 0; wrk_arr = your_arr
idx = numpy.arange(0,len(wrk_arr))
while ii<=len(wrk_arr)-1:
    i_list = numpy.arange(0,len(wrk_arr)
    candidate = numpy.matrix(wrk_arr[ii,:])
    i_dup = numpy.array([0] * len(wrk_arr))
    numpy.all(candidate == wrk_arr,axis=1, iout = idup)
    idup[ii]=0
    i_list = numpy.unique(i_list * (1-idup))
    idx = numpy.unique(idx * (1-idup))
    wrk_arr = wrk_arr[i_list,:]
    ii += 1

结果是 wrk_arr,它是您的数组(your_arr)的唯一排序数组。关系为:
your_arr[idx,:] = wrk_arr

它的工作方式类似于MATLAB,因为返回的数组(wrk_arr)保持原始数组(your_arr)的顺序。 idx数组与MATLAB不同,因为它包含第一次出现的索引,而MATLAB返回最后一次出现。

从我的经验来看,在10000 X 4矩阵上,它的速度与MATLAB一样快。

对于列的情况,转置将起到作用。


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