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).