2015-10-19 200 views
1

我有一个numpy arrays的列表。我怎样才能从列表中删除重复的数组?如何从numpy数组列表中删除重复的元素?

我试图set(arrays)但得到了错误 “类型错误:unhashable类型:“numpy.ndarray”

实施例的2D阵列(防雷实际上3D)。这里起始列表是长度10.不同数组的输出列表应该是长度8,因为索引0,5,9处的元素都是相等的。

>>> import numpy 
>>> numpy.random.seed(0) 
>>> arrays = [numpy.random.randint(2, size=(2,2)) for i in range(10)] 
>>> numpy.array_equal(arrays[0], arrays[5]) 
True 
>>> numpy.array_equal(arrays[5], arrays[9]) 
True 
+0

你看看这里:http://stackoverflow.com/questions/27751072/removing-duplicates从一个numpy数组列表? –

+0

谢谢。最后,我想要一个数组列表,而不是字符串列表,但其他答案中的一个帮助。 –

回答

1

你可以从输入列表中收集所有这些数组到一个NumPy数组中。然后,它将以连续的顺序带来所有重复的行。然后,沿行进行分化,给我们全部为零的重复行,这可以使用(sorted_array==0).all(1)来提取。这会给你一个重复起始位置的掩码,它可以用来从连接数组中选择元素。最后,选定的元素被重新整形并通过沿着第一个轴分割返回到数组格式列表。因此,你将有一个量化的实现,像这样 -

A = numpy.concatenate((arrays)).reshape(-1,arrays[0].size) 

sortedA = A[numpy.lexsort(A.T)] 

idx = numpy.append(True,~(numpy.diff(sortedA,axis=0)==0).all(1)) 

out = numpy.vsplit((A.reshape((len(arrays),) + arrays[0].shape))[idx],idx.sum()) 

样品输入,输出 -

In [238]: arrays 
Out[238]: 
[array([[0, 1], 
     [1, 0]]), array([[1, 1], 
     [1, 1]]), array([[1, 1], 
     [1, 0]]), array([[0, 1], 
     [0, 0]]), array([[0, 0], 
     [0, 1]]), array([[0, 1], 
     [1, 0]]), array([[0, 1], 
     [1, 1]]), array([[1, 0], 
     [1, 0]]), array([[1, 0], 
     [1, 1]]), array([[0, 1], 
     [1, 0]])] 

In [239]: out 
Out[239]: 
[array([[[0, 1], 
     [1, 0]]]), array([[[1, 1], 
     [1, 1]]]), array([[[1, 1], 
     [1, 0]]]), array([[[0, 1], 
     [1, 0]]]), array([[[0, 1], 
     [1, 1]]]), array([[[1, 0], 
     [1, 0]]]), array([[[1, 0], 
     [1, 1]]]), array([[[0, 1], 
     [1, 0]]])] 
0

最后,环绕在列表与numpy.array_equal

distinct = list() 
for M in arrays: 
    if any(numpy.array_equal(M, N) for N in distinct): 
     continue 
    distinct.append(M) 

这是为O比较(N ** 2),但什么嘿。

0

您可以使用tostringfromstring转换为可哈希项目(字节字符串)和来自可哈希项目(字节字符串)。你可以把它们放在一组中:

>>> arrs = [np.random.random(10) for _ in range(10)] 
>>> arrs += arrs # create duplicate items 
>>> 
>>> darrs = set((arr.tostring(), arr.dtype) for arr in arrs) 
>>> uniq_arrs = [np.fromstring(arr, dtype=dtype) for arr, dtype in darrs] 
相关问题