2015-10-19 230 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] 
相關問題