İki uyuşmuş diziyi iki koşula uyum için karşılaştırmak
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 A
sütunda 1 ve AYNI B
sü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 A
ve B
hepsi 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
İ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.unique
kopya 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 flatnonzero
yerine nonzero
:
test2 = np.all(np.unique(np.concatenate((np.flatnonzero(A), np.flatnonzero(B))), return_counts=True)[1] == 1)
Daha verimli bir test np.intersect1d
benzer şekilde kullanır:
test2 = not np.intersect1d(np.flatnonzero(A), np.flatnonzero(B)).size
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
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))