Cómo aplicar la máscara de la matriz a otra matriz en numpy

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