Je veux vérifier combien d'éléments du tableau numpy à l'intérieur du tableau numpy sont différents. La solution ne doit pas contenir de compréhension de liste. Quelque chose dans ce sens (notez que a et b diffèrent dans le dernier tableau):

a = np.array( [[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5]] )
b = np.array( [[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,0,0]] )
y = diff_count( a,b )
print y

>> 1
4
Codevan 12 avril 2018 à 10:50

4 réponses

Meilleure réponse

Approche n ° 1

Effectuez une comparaison élément par élément pour la non-égalité, puis obtenez une réduction ANY le long du dernier axe et enfin comptez -

(a!=b).any(-1).sum()

Approche n ° 2

Probablement plus rapide avec np.count_nonzero pour compter les booléens -

np.count_nonzero((a!=b).any(-1))

Approche n ° 3

Beaucoup plus rapide avec views -

# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

a1D,b1D = view1D(a,b)
out = np.count_nonzero(a1D!=b1D)

Analyse comparative

In [32]: np.random.seed(0)
    ...: m,n = 10000,100
    ...: a = np.random.randint(0,9,(m,n))
    ...: b = a.copy()
    ...: 
    ...: # Let's set 10% of rows as different ones
    ...: b[np.random.choice(len(a), len(a)//10, replace=0)] = 0

In [33]: %timeit (a!=b).any(-1).sum() # app#1 from this soln
    ...: %timeit np.count_nonzero((a!=b).any(-1)) # app#2
    ...: %timeit np.any(a - b, axis=1).sum() # @Graipher's soln
1000 loops, best of 3: 1.14 ms per loop
1000 loops, best of 3: 1.08 ms per loop
100 loops, best of 3: 2.33 ms per loop

In [34]: %%timeit  # app#3
    ...: a1D,b1D = view1D(a,b)
    ...: out = np.count_nonzero((a1D!=b1D).any(-1))
1000 loops, best of 3: 797 µs per loop
2
Divakar 12 avril 2018 à 08:10

Vous pouvez l'essayer en utilisant np.ravel(). Si vous voulez une comparaison par élément.

(a.ravel()!=b.ravel()).sum()
(a-b).any(axis=0).sum()

Les lignes ci-dessus donnent 2 en sortie.

Si vous souhaitez une comparaison par ligne, vous pouvez utiliser.

(a-b).any(axis=1).sum()

Cela donne 1 en sortie.

1
Sandeep Kadapa 12 avril 2018 à 09:22

Est-ce que cela fonctionnerait?

y=sum(a[i]!=b[i]for i in range len(a))

Désolé de ne pas pouvoir le tester moi-même pour le moment.

0
Super S 12 avril 2018 à 08:52

Vous pouvez utiliser numpy.any pour cela :

y = np.any(a - b, axis=1).sum()
0
Graipher 12 avril 2018 à 07:52