10
votes

Comparer plusieurs tableaux numpus

Comment devrais-je comparer plus de 2 matrices numpues?

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


2 commentaires

"Et je ne suis pas intéressé par la comparaison de tableaux deux à la fois" - Eh bien, c'est la meilleure option que vous avez.


@ user2357112 qui ne serait pas facile s'il y a beaucoup de tableaux


4 Réponses :


8
votes

Pour trois matrices, vous pouvez vérifier l'égalité entre les éléments correspondants entre les premier et second matrices, puis les deuxième et troisième tableaux pour nous donner deux scalaires booléens et enfin voir si ces deux stagiers sont true code > Pour la sortie scalaire finale, comme -

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


2 commentaires

quel est le besoin de remodeler (len (l), - 1), cela fonctionne bien même sans que


@Jayanthreddy non, ça ne le fait pas. Cet axe contiendrait le premier axe des tableaux d'entrée fusionnés avec l'axe d'empilement. Nous devons donc diviser cet axe en deux avec ce remodelage. Pour clarifier avec un exemple, essayez avec a = np.random.randint (0,9, (4,5,3)); B = A.Copy (); c = A.Copy () .



6
votes

Pour trois tableaux, vous devriez vraiment les comparer à deux à la fois: xxx pré>

pour un nombre variable de tableaux, supposons qu'ils soient tous combinés dans un grand tableau tableaux code>. Ensuite, vous pourriez faire P>

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


1 commentaires

@JayantHreddy: Probablement parce que vous avez formulé des tableaux une liste ou quelque chose.



4
votes

Pour développer les réponses précédentes, j'utiliserais combinaisons code> à partir de iTertools code> pour construire toutes paires, puis exécutez votre comparaison sur chaque paire. Par exemple, si j'ai trois matrices et que je veux confirmer qu'ils sont tous égaux, j'utiliserais:

from itertools import combinations

for pair in combinations([a, b, c], 2):
    assert np.array_equal(pair[0], pair[1])


3 commentaires

Construire toutes les paires n'est pas nécessaire (puisque A = B et B = C impliquerait A = C). Une simple boucle comparant 2 tableaux à la fois serait plus efficace de calcul.


C'est correct! Ceci est explicitement inefficace. Juste une méthode de comparaison intuitivement / de manière transparente chaque article aux autres.


Cette réponse est utile pour float des tableaux où vous voudriez utiliser allcLose au lieu de array_equal ; AllClose n'est pas transitif . @Elsewhere Peut-être que vous pourriez accroître votre réponse en fonction de cela que la question ne demande pas explicitement de comparer pour l'égalité et ne restreint pas les tableaux int .



0
votes

Solution prenant en charge différentes formes et nans

comparer contre le premier élément de la liste des array: p> xxx pré>

sortie strong> p>

all_equal(lst_eq)= True
all_equal(lst_neq)= False


0 commentaires