如何计算NumPy数组列表中重复元素的数量?

3

我有一个数组列表(排列),需要进行清理。 这是我的当前列表的样子:

>>>permutations
[array([1, 2, 6, 7]),
 array([1, 2, 6, 7]),
 array([1, 2, 6, 7]),
 array([1, 2, 3, 8]),
 array([1, 2, 3, 8]),
 array([1, 2, 3, 8]),
 array([2, 3, 4, 9]),
 array([2, 3, 4, 9]),
 array([2, 3, 4, 9]),
 array([ 3,  4,  5, 10]),
 array([ 3,  4,  5, 10]),
 array([ 3,  4,  5, 10]),
 array([ 4,  5,  6, 11]),
 array([ 4,  5,  6, 11]),
 array([ 4,  5,  6, 11]),
 array([ 1,  5,  6, 12]),
 array([ 1,  5,  6, 12]),
 array([ 1,  5,  6, 12])]

我的要求:

>>>neat_perm
[(array([1, 2, 6, 7]),3), 
(array([1, 2, 3, 8]),3),
(array([2, 3, 4, 9]),3)
(array([3, 4, 5, 10]), 3),
(array([4, 5, 6, 11]), 3),
(array([1, 5, 6, 12]), 3)]

我想做的是创建一个元组列表,其中元组的第一个元素是数组,元组的第二个元素是在 permutations 中重复出现的次数。

直接而暴力的方法是对数组进行 O(n^2) 的 np.array_equal 操作,以确保没有重复项。问题在于算法复杂度。因为 np 数组不可哈希,所以 list(set(permutations))permutations.count() 不能使用。

我将非常感谢您给我的任何建议,以使代码更有效率,无论是行数还是时间/内存复杂度!

1个回答

6

一种解决方法是使用 np.unique() 并设置参数 return_counts = True,然后将得到的唯一数组及其计数进行压缩:

from numpy import array
import numpy as np

permutations = [array([1, 2, 6, 7]),
         array([1, 2, 6, 7]),
         array([1, 2, 6, 7]),
         array([1, 2, 3, 8]),
         array([1, 2, 3, 8]),
         array([1, 2, 3, 8]),
         array([2, 3, 4, 9]),
         array([2, 3, 4, 9]),
         array([2, 3, 4, 9]),
         array([ 3,  4,  5, 10]),
         array([ 3,  4,  5, 10]),
         array([ 3,  4,  5, 10]),
         array([ 4,  5,  6, 11]),
         array([ 4,  5,  6, 11]),
         array([ 4,  5,  6, 11]),
         array([ 1,  5,  6, 12]),
         array([ 1,  5,  6, 12]),
         array([ 1,  5,  6, 12])]


>>> list(zip(*np.unique(permutations, return_counts = True, axis = 0)))

[(array([1, 2, 3, 8]), 3),
 (array([1, 2, 6, 7]), 3),
 (array([ 1,  5,  6, 12]), 3),
 (array([2, 3, 4, 9]), 3),
 (array([ 3,  4,  5, 10]), 3),
 (array([ 4,  5,  6, 11]), 3)]

感谢您的回答@sacuL!np.unique后面的“*”是什么意思? - bad_chemist
np.unique 带有 return_counts = True 参数会返回一个包含数组及其计数的元组,因此 * 运算符可以将其解压成两个单独的数组,然后可以将它们一起压缩。 - sacuL

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