如何计算numpy数组列表中的重复数?
我有一个需要清理的数组(排列)列表。这是我当前列表的样子:
>>>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 以确保没有重复。问题在于算法的复杂性。list(set(permutations)),permutations.count()不起作用,因为 np 数组不可散列。
我将不胜感激您对我的任何建议,以便在所需的代码行或时间/内存复杂性方面更有效!
回答
一种解决方案是使用np.unique()with 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)]