İki uyuşmuş diziyi iki koşula uyum için karşılaştırmak

Aug 18 2020

Aynı şekle, A ve B'ye sahip, 1'ler ve 0'lardan oluşan iki uyuşmuş dizi düşünün. Küçük bir örnek gösterilmektedir:

A = [[1 0 0 1]         B = [[0 0 0 0]
     [0 0 1 0]              [0 0 0 0]
     [0 0 0 0]              [1 1 0 0]
     [0 0 0 0]              [0 0 1 0]
     [0 0 1 1]]             [0 1 0 1]]

Şimdi iki Boole değişkenine test1 ve test2'ye aşağıdaki gibi değerler atamak istiyorum :

test1 : Bir Asütunda 1 ve AYNI Bsütunda 1'in tam olarak 1 veya 2'lik satır farklılıklarına sahip olduğu en az bir örnek var mı? Eğer öyleyse, test1 = True, aksi takdirde False.

Yukarıdaki örnekte, her iki dizinin 0. sütununda 2 satır aralıklı 1'ler vardır, bu nedenle test1 = True. (2. sütunda başka örnekler de var, ancak bu önemli değil - sadece bir örneğe ihtiyacımız var.)

test2 : içindeki 1 değerler mi Ave Bhepsi farklı dizi adreslerine mi sahip? Eğer öyleyse, test2 = True, aksi takdirde False.

Yukarıdaki örnekte, her iki dizide de vardır [4,3] = 1, bu nedenle test2 = False.

Bunu yapmanın etkili bir yolunu bulmakta zorlanıyorum ve biraz yardımdan memnun olurum.

Yanıtlar

1 MadPhysicist Aug 18 2020 at 09:53

İki dizinin aynı sütunda bir öğe ayrı (yalnızca bir yönde) girişi olup olmadığını test etmenin basit bir yolu:

(A[1:, :] * B[:-1, :]).any(axis=None)

Yani yapabilirsin

test1 = (A[1:, :] * B[:-1, :] + A[:-1, :] * B[1:, :]).any(axis=None) or (A[2:, :] * B[:-2, :] + A[:-2, :] * B[2:, :]).any(axis=None)

İkinci test, konumları indislere dönüştürerek, bunları bir araya getirerek ve np.uniquekopya sayısını saymak için kullanılarak yapılabilir . Bir dizi hiçbir zaman yinelenen indislere sahip olmayacağından, kopyalar yalnızca iki dizide aynı dizinden gelebilir. Biz ayrıca kullanarak hesaplama hızlandırabilir flatnonzeroyerine nonzero:

test2 = np.all(np.unique(np.concatenate((np.flatnonzero(A), np.flatnonzero(B))), return_counts=True)[1] == 1)

Daha verimli bir test np.intersect1dbenzer şekilde kullanır:

test2 = not np.intersect1d(np.flatnonzero(A), np.flatnonzero(B)).size
1 Ehsan Aug 18 2020 at 08:14

Masked_array'leri kullanabilirsiniz ve ikinci görev için şunları yapabilirsiniz:

A_m = np.ma.masked_equal(A, 0)
B_m = np.ma.masked_equal(B, 0)

test2 = np.any((A_m==B_m).compressed())

Ve ilk görevi yapmanın saf bir yolu:

test1 = np.any((np.vstack((A_m[:-1],A_m[:-2],A_m[1:],A_m[2:]))==np.vstack((B_m[1:],B_m[2:],B_m[:-1],B_m[:-2]))).compressed())

çıktı:

True
True
ArundeepChohan Aug 18 2020 at 09:56

Test2 için: 1 değeri için bulunan benzer dizinler bulup bulmadıklarını kontrol edebilirsiniz.

A =  np.array([[1, 0, 0, 1],[0, 0, 1, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 1, 1]])
B = np.array([[0, 0, 0, 0],[0, 0, 0, 0],[1, 1, 0, 0],[0, 0, 1, 0],[0, 1, 0, 1]])
print(len(np.intersect1d(np.flatnonzero(A==1),np.flatnonzero(B==1)))>0))