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

9 投票
2 回答
3066 浏览
提问于 2025-04-16 22:00

我正在把一些东西从MATLAB语言翻译成Python语言。

NumPy中,有一个命令叫做unique(a)。但是因为MATLAB程序还运行了'rows'命令,所以它的结果有点不同。

在Python中有没有类似的命令,还是我需要自己写个算法来实现相同的功能呢?

2 个回答

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 行 4 列的矩阵时,它的速度和 MATLAB 一样快。

如果你需要处理列的情况,转置一下就可以解决问题。

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') 的功能,你只需要先转置原始数组,执行上面提到的步骤,然后再转置回来。

撰写回答