¿Qué hace `x ` en numpy?

Digamos que tengo una matriz x = np.arange(6).reshape(3, 2) .

¿Cuál es el significado de x[False] o x[np.asanyarray(False)] ? Ambos resultan en una array([], shape=(0, 3, 2), dtype=int64) , lo cual es inesperado.

Esperaba obtener un IndexError debido a una máscara de tamaño incorrecto, como de algo como x[np.ones((2, 2), dtype=np.bool)] .

Este comportamiento es consistente para x[True] x[np.asanyarray(True)] , ya que ambos dan como resultado una dimensión adicional: array([[[0, 1], [2, 3], [4, 5]]]) .

Estoy usando numpy 1.13.1. Parece que el comportamiento ha cambiado recientemente, así que si bien es bueno tener respuestas para versiones anteriores, mencione su versión en las respuestas.

EDITAR

Sólo para completar, presenté https://github.com/numpy/numpy/issues/9515 basado en el comentario sobre esta pregunta.

Editar 2

Y lo cerró casi de inmediato.

Técnicamente, no hay ningún requisito de que la dimensionalidad de una máscara coincida con la dimensionalidad de la matriz que indexa con ella. (En las versiones anteriores, había incluso menos restricciones, y podrías salir con algunos desajustes de formas extremas).

Los documentos describen la indexación booleana como

Una única matriz de índice booleano es prácticamente idéntica a x [obj.nonzero ()] donde, como se describió anteriormente, obj.nonzero () devuelve una tupla (de longitud obj.ndim) de matrices de índices enteros que muestran los elementos True de obj.

pero el nonzero es raro para la entrada de 0 dimensiones, por lo que este caso es una de las formas en que “prácticamente idénticas” no son idénticas:

la equivalencia distinta de cero para matrices booleanas no se mantiene para matrices booleanas de dimensión cero.

NumPy tiene un caso especial para un índice booleano de 0 dimensiones, motivado por el deseo de tener el siguiente comportamiento:

 In [3]: numpy.array(3)[True] Out[3]: array([3]) In [4]: numpy.array(3)[False] Out[4]: array([], dtype=int64) 

Me referiré a un comentario en el código fuente que maneja un índice booleano de 0 dimensiones:

 if (PyArray_NDIM(arr) == 0) { /* * This can actually be well defined. A new axis is added, * but at the same time no axis is "used". So if we have True, * we add a new axis (a bit like with np.newaxis). If it is * False, we add a new axis, but this axis has 0 entries. */ 

Si bien esto se destina principalmente a un índice de 0 dimensiones a una matriz de 0 dimensiones, también se aplica a la indexación de matrices multidimensionales con valores booleanos. Así,

 x[True] 

es equivalente a x[np.newaxis] , produciendo un resultado con un nuevo eje de longitud-1 en el frente, y

 x[False] 

produce un resultado con un nuevo eje delante de la longitud 0, sin seleccionar elementos.