2016-06-12 5 views
5

Jak powinienem porównać więcej niż 2 numpy tablic?Porównywanie wielu tablic numpy

import numpy 
a = numpy.zeros((512,512,3),dtype=numpy.uint8) 
b = numpy.zeros((512,512,3),dtype=numpy.uint8) 
c = numpy.zeros((512,512,3),dtype=numpy.uint8) 
if (a==b==c).all(): 
    pass 

to daje wartośćError, i nie jestem zainteresowany porównywaniem tablic po dwa naraz.

+2

" i nie jestem zainteresowany porównywaniem tablic dwa na raz "- cóż, jest to najlepsza opcja, którą masz. – user2357112

+0

@ user2357112, które nie byłoby łatwe, jeśli istnieje wiele tablic –

Odpowiedz

4

Dla trzech tablic można sprawdzić równość między odpowiednimi elementami między pierwszą i drugą tablicą, a następnie drugą i trzecią tablicę, aby uzyskać dwa binarne skalary i ostatecznie sprawdzić, czy oba te skalary są True dla końcowego wyniku skalarnego, jak tak -

np.logical_and((a==b).all(), (b==c).all()) 

więcej liczby tablic, można je układać, różnicowanie się wzdłuż osi układania i sprawdzić, czy wszystkotych zróżnicowań są równe zerami. Jeśli tak, to mamy równość między wszystkimi tablicami wejściowymi, w przeciwnym razie nie. Realizacja będzie wyglądać tak -

L = [a,b,c] # List of input arrays 
out = (np.diff(np.vstack(L).reshape(len(L),-1),axis=0)==0).all() 
+0

, co jest potrzebne do zmiany kształtu (len (L), - 1), działa dobrze nawet bez tego –

+0

@JayanthReddy Nie, nie ma. Oś ta zawierałaby pierwszą oś z tablic wejściowych połączonych z osią układania w stos. Musimy więc podzielić tę oś na dwie z tym przekształceniem. Aby wyjaśnić na przykładzie, wypróbuj za pomocą 'a = np.random.randint (0,9, (4,5,3)); b = a.copy(); c = a.copy() '. – Divakar

3

przez trzy tablice, należy naprawdę tylko porównać je dwie naraz:

if np.array_equal(a, b) and np.array_equal(b, c): 
    do_whatever() 

Dla zmiennej liczby tablic, załóżmy, wszystkie są połączone w jedną dużą tablicę arrays. Wtedy możesz zrobić "

if np.all(arrays[:-1] == arrays[1:]): 
    do_whatever() 
+0

@JayanthReddy: Prawdopodobnie dlatego, że stworzyłeś 'tablice' listę lub coś. – user2357112