2017-10-17 2 views
1

Comment vous appliquez un masque en numpy pour obtenir cette sortie?Comment appliquer un masque de tableau à une autre matrice en numpy

ar2 = np.arange(1,26)[::-1].reshape([5,5]).T 
ar3 = np.array([1,1,-1,-1,1]) 
print ar2, '\n\n', ar3 

[[25 20 15 10 5] 
[24 19 14 9 4] 
[23 18 13 8 3] 
[22 17 12 7 2] 
[21 16 11 6 1]] 

[ 1 1 -1 -1 1] 

--apply où ar3 = 1: ar2/ar2[:,0][:, np.newaxis]

--apply où ar3 = -1: ar2/ar2[:,4][:, np.newaxis]

Le résultat je suis AFTER est:

[[1 0 0 0 0] 
[1 0 0 0 0] 
[ 7 6 4 2 1] 
[11 8 6 3 1] 
[1 0 0 0 0]] 

Je essayé np.where()

Répondre

3

Je ne vois pas pourquoi travailler np.where ne devrait pas ici:

>>> np.where((ar3==1)[:, None], 
...   ar2 // ar2[:, [0]], # where condition is True, divide by first column 
...   ar2 // ar2[:, [4]]) # where condition is False, divide by last column 
array([[ 1, 0, 0, 0, 0], 
     [ 1, 0, 0, 0, 0], 
     [ 7, 6, 4, 2, 1], 
     [11, 8, 6, 3, 1], 
     [ 1, 0, 0, 0, 0]]) 

J'utilise Python 3 qui est la raison pour laquelle je // (division sol) au lieu de division régulière (/) autrement le résultat contiendrait des flottants.

Cela calcule les tableaux avec impatience, il évalue ar2 // ar2[:, [0]]etar2 // ar2[:, [4]] pour toutes les valeurs. Tenir effectivement 3 tableaux de la taille de ar2 en mémoire (le résultat et les deux temporaires). Si vous le souhaitez, vous avez besoin de plus efficace mémoire pour faire appliquer le masque avant de faire l'opération:

>>> res = np.empty_like(ar2) 
>>> mask = ar3 == 1 
>>> res[mask] = ar2[mask] // ar2[mask][:, [0]] 
>>> res[~mask] = ar2[~mask] // ar2[~mask][:, [4]] 
>>> res 
array([[ 1, 0, 0, 0, 0], 
     [ 1, 0, 0, 0, 0], 
     [ 7, 6, 4, 2, 1], 
     [11, 8, 6, 3, 1], 
     [ 1, 0, 0, 0, 0]]) 

Cela calcule uniquement les valeurs qui utilise moins de mémoire (et est probablement plus rapide aussi).

2

Pas le plus élégant, mais voici ce que je pouvais penser.

m = ar3 == -1 
a = (ar2 // ar2[:, [0]]) 
a[m] = (ar2 // ar2[:, [4]])[m] 

print(a) 
array([[ 1, 0, 0, 0, 0], 
     [ 1, 0, 0, 0, 0], 
     [ 7, 6, 4, 2, 1], 
     [11, 8, 6, 3, 1], 
     [ 1, 0, 0, 0, 0]], dtype=int32)