¿Cómo aplico una máscara en numpy para obtener esta salida?
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]
–applicar donde ar3 = 1: ar2/ar2[:,0][:, np.newaxis]
–applica donde ar3 = -1: ar2/ar2[:,4][:, np.newaxis]
El resultado que estoy buscando es:
[[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]]
He intentado np.where()
No veo por qué np.where
no debería funcionar aquí:
>>> 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]])
Estoy usando Python 3, por eso usé //
(división del piso) en lugar de la división regular ( /
), de lo contrario el resultado contendría flotantes.
Esto calcula las matrices con entusiasmo, por lo que evalúa ar2 // ar2[:, [0]]
y ar2 // ar2[:, [4]]
para todos los valores. ar2
efectivamente 3 arreglos del tamaño de ar2
en la memoria (el resultado y los dos temporarios). Si desea que la memoria sea más eficiente, debe aplicar la máscara antes de realizar la operación:
>>> 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]])
Esto calcula solo los valores necesarios que usan menos memoria (y probablemente también sea más rápido).
No es el más elegante, pero esto es lo que pude pensar.
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)