Numpy tutorial – indexación booleana

Leyendo el tutorial rápido de Numpy, no puedo entender esta oración.

a = np.arange(12).reshape(3,4) b1 = np.array([False,True,True]) b2 = np.array([True,False,True,False]) >>> a[b1,b2] array([ 4, 10]) 

¿Por qué a[b1,b2] es array([4,10]) lugar de array([[4,6],[8,10]]) ?

Es porque estás realizando integer array indexing allí.

Internamente, los índices se calculan a partir de matrices booleanas:

 In [72]: idx1 = np.flatnonzero(b1) In [73]: idx2 = np.flatnonzero(b2) In [75]: idx1 Out[75]: array([1, 2]) In [76]: idx2 Out[76]: array([0, 2]) 

Luego, la indexación de la matriz entera se realiza en cada grupo de índices utilizando cada elemento de las matrices de indexación –

 In [77]: a[1,0] # 1 from idx1[0], 0 from idx2[0] Out[77]: 4 In [78]: a[2,2] # 2 from idx1[1], 2 from idx2[1] Out[78]: 10 

Para lograr la extracción de bloques con estilo de MATLAB, necesitamos usar matrices abiertas e indexar en cada uno de esos ejes / atenuaciones. Para crear tales matrices abiertas en NumPy, tenemos np.ix_

 In [89]: np.ix_(b1,b2) Out[89]: (array([[1], [2]]), array([[0, 2]])) In [90]: a[np.ix_(b1,b2)] Out[90]: array([[ 4, 6], [ 8, 10]])