Python 当我有大量数组时检查重复数组
我计算图形中的各种模式,并将相关信息存储在大小为N的numpy数组列表的defaultdict中,其中索引值是整数 我想知道我是否正在创建一个重复的数组。不删除重复项会使重复项的数量呈指数级增长,使我所做的事情变得不可行。但可能有成千上万个数组,存储在不同的列表中,不同的键下。据我所知,我不能散列数组 如果我只需要检查重复的非零索引,我会将非零索引存储为1的位序列,然后散列该值。但是,我不仅需要检查索引,还需要检查它们的整数值。除了提出一个使用不同结构的完全熟悉的设计之外,还有什么方法可以做到这一点吗Python 当我有大量数组时检查重复数组,python,arrays,python-2.7,numpy,hash,Python,Arrays,Python 2.7,Numpy,Hash,我计算图形中的各种模式,并将相关信息存储在大小为N的numpy数组列表的defaultdict中,其中索引值是整数 我想知道我是否正在创建一个重复的数组。不删除重复项会使重复项的数量呈指数级增长,使我所做的事情变得不可行。但可能有成千上万个数组,存储在不同的列表中,不同的键下。据我所知,我不能散列数组 如果我只需要检查重复的非零索引,我会将非零索引存储为1的位序列,然后散列该值。但是,我不仅需要检查索引,还需要检查它们的整数值。除了提出一个使用不同结构的完全熟悉的设计之外,还有什么方法可以做到这
谢谢。基本思想是“我如何使用我自己的
散列
(可能还有=
)在集合中以不同的方式存储内容
/dict
?”(“differentive”包括“而不引起类型错误
,因为它是不可散列的)
答案的第一部分是定义散列函数,例如以下内容。但是,请注意基于它的标准非答案:将每个对象的自定义散列存储在集中(或者使用dict将其映射到原始对象)。您不必提供相等实现,这暗示这是错误的:哈希值并不总是唯一的!(例外:如果您想,并且知道所有键都将超过映射的寿命,id
确实提供唯一的“哈希”。)
答案的剩余部分是将所需的键封装在对象中,对象将散列/相等函数公开为\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!(C程序员通常会称这样做为未定义的行为。)
有关代码,请参阅(其中包括一个选项,该选项通过将比较建立在不太可能被其他代码更改的私有副本上来提高安全性),虽然我会添加\uuuu插槽\uuuuu
以减少内存开销。如果数组大小相同,为什么不使用矩阵并使用np.unique(array,axis=0)
删除重复项?我不知道在任何给定迭代中会有多少个数组,而且我认为附加numpy数组很昂贵(如果我错了,请有人纠正我)。我可以这样做,这将部分解决问题,但我不确定这会有多大好处。如果您通过迭代生成数组,如果每个迭代都需要相当长的时间,那么您最好使用不可变和可散列的元组加上一个集合来保持唯一数组。否则,只需使用numpy数组(您可以使用np.fromiter
函数创建该数组),并使用np.unique(arr,axis=0)删除重复项
。也不要忘记,您可以随时运行基准测试,查看将iterable转换为numpy数组并执行np.unique
的成本是否会克服删除重复项的成本。“我不能散列数组”:ndarray
与内置的hash
函数不兼容(为了防止它们被用作dict
键,这是另一回事)但是底层数据绝对可以进行散列,例如使用hash(x.tobytes())
。这有助于解决您的问题吗?