【问题标题】:How to calculate number of duplicates in a list of numpy arrays?如何计算numpy数组列表中的重复数?
【发布时间】:2021-04-23 16:17:57
【问题描述】:

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

>>>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 数组不可散列。

如果您对我提出的任何建议,我将不胜感激,以便在所需的代码行或时间/内存复杂性方面提高效率!

【问题讨论】:

    标签: python arrays list numpy


    【解决方案1】:

    一种解决方案是将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 后面的“*”是做什么的?
    • np.uniquereturn_counts = True 返回数组的元组及其计数,因此 * 运算符将其解压缩为两个单独的数组,然后可以将它们压缩在一起
    猜你喜欢
    • 2015-06-07
    • 2019-02-21
    • 2020-06-04
    • 1970-01-01
    • 2019-06-16
    • 2021-08-13
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    相关资源
    最近更新 更多