簡體   English   中英

在Python中查找兩個大型數組(矩陣)之間的集合差異

[英]Find the set difference between two large arrays (matrices) in Python

我有兩個大的二維數組,我想找到它們的集合差異,將它們的行作為元素。 在Matlab中,這個代碼的代碼是setdiff(A,B,'rows') 數組足夠大,我想到的明顯的循環方法需要花費太長時間。

應該可行,但由於正在創建的視圖的mergesort不可用,因此目前在1.6.1中已中斷。 它適用於1.7.0之前的版本。 這應該是最快的方法,因為視圖不必復制任何內存:

>>> import numpy as np
>>> a1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a2 = np.array([[4,5,6],[7,8,9],[1,1,1]])
>>> a1_rows = a1.view([('', a1.dtype)] * a1.shape[1])
>>> a2_rows = a2.view([('', a2.dtype)] * a2.shape[1])
>>> np.setdiff1d(a1_rows, a2_rows).view(a1.dtype).reshape(-1, a1.shape[1])
array([[1, 2, 3]])

你可以用Python做到這一點,但它可能很慢:

>>> import numpy as np
>>> a1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a2 = np.array([[4,5,6],[7,8,9],[1,1,1]])
>>> a1_rows = set(map(tuple, a1))
>>> a2_rows = set(map(tuple, a2))
>>> a1_rows.difference(a2_rows)
set([(1, 2, 3)])

這是一個很好的替代純numpy解決方案,適用於1.6.1。 它確實創建了一個中間數組,因此這對您來說可能是也可能不是問題。 它也不依賴於排序數組的任何加速(如setdiff可能的那樣)。

from numpy import *
# Create some sample arrays
A =random.randint(0,5,(10,3))
B =random.randint(0,5,(10,3))

舉個例子,這就是我得到的 - 請注意,有一個共同的元素:

>>> A
array([[1, 0, 3],
       [0, 4, 2],
       [0, 3, 4],
       [4, 4, 2],
       [2, 0, 2],
       [4, 0, 0],
       [3, 2, 2],
       [4, 2, 3],
       [0, 2, 1],
       [2, 0, 2]])
>>> B
array([[4, 1, 3],
       [4, 3, 0],
       [0, 3, 3],
       [3, 0, 3],
       [3, 4, 0],
       [3, 2, 3],
       [3, 1, 2],
       [4, 1, 2],
       [0, 4, 2],
       [0, 0, 3]])

我們尋找行之間的(L1)距離為零。 這給了我們一個矩陣,在它為零的點上,這些是兩個列表共有的項:

idx = where(abs((A[:,newaxis,:] - B)).sum(axis=2)==0)

作為檢查:

>>> A[idx[0]]
array([[0, 4, 2]])
>>> B[idx[1]]
array([[0, 4, 2]])

我不確定你的目的是什么,但這會得到一個布爾數組,其中2個數組不相等,並且會快速numpy:


import numpy as np
a = np.random.randn(5, 5)
b = np.random.randn(5, 5)
a[0,0] = 10.0
b[0,0] = 10.0 
a[1,1] = 5.0
b[1,1] = 5.0
c = ~(a-b==0)
print c

[[False True True True True] [ True False True True True] [ True True True True True] [ True True True True True] [ True True True True True]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM