从numPy数组列表中删除重复项

SoI*_*ins 5 python arrays numpy list duplicate-removal

我有一个普通的Python列表,其中包含(多维)numPy数组,它们的形状和值均相同。列表中的某些数组是早期数组的重复。

我有一个要删除所有重复项的问题,但是数据类型为numPy数组这一事实使这一点变得有些复杂...

•我不能使用set(),因为numPy数组不可哈希。
•我无法在插入过程中检查重复项,因为数组是通过函数批量生成的,并使用.extend()添加到列表中。
•numPy数组不能不通过numPy自己的函数之一直接进行比较,因此我不能只使用“ if x in list” ...
• 列表的内容需要在最后保留numPy数组的过程; 我可以比较转换为嵌套列表的数组的副本,但是不能将数组永久转换为直接的python列表。

关于如何有效地删除重复项的任何建议?

Joe*_*oel 7

使用此处的解决方案:Most effective property to hash for numpy array我们发现,如果 a 是 numpy 数组,则使用 a.tostring() 进行哈希处理效果最佳。所以:

import numpy as np
arraylist = [np.array([1,2,3,4]), np.array([1,2,3,4]), np.array([1,3,2,4])]
L = {array.tostring(): array for array in arraylist}
L.values() # [array([1, 3, 2, 4]), array([1, 2, 3, 4])]
Run Code Online (Sandbox Code Playgroud)


Dun*_*nes 5

根据数据的结构,直接比较所有数组可能比找到某种方法对数组进行哈希处理更快。该算法的复杂度为 O(n^2),但每次单独的比较都会比创建数组的字符串或 Python 列表快得多。所以这取决于您需要检查多少个数组。

例如。

uniques = []
for arr in possible_duplicates:
    if not any(numpy.array_equal(arr, unique_arr) for unique_arr in uniques):
        uniques.append(arr)
Run Code Online (Sandbox Code Playgroud)