Numpy: ¿Debería usar newaxis o None?

91

En numpy, uno puede usar el objeto 'newaxis' en la sintaxis de corte para crear un eje de longitud uno, por ejemplo:

import numpy as np
print np.zeros((3,5))[:,np.newaxis,:].shape
# shape will be (3,1,5)

La documentación indica que también se puede usar en Nonelugar de newaxis, el efecto es exactamente el mismo.

¿Hay alguna razón para elegir uno sobre el otro? ¿Existe alguna preferencia general o guía de estilo? Mi impresión es que newaxises más popular, probablemente porque es más explícito. Entonces, ¿hay alguna razón por la que Noneesté permitido?

nikow
fuente

Respuestas:

103

Noneestá permitido porque numpy.newaxises simplemente un alias de None.

In [1]: import numpy

In [2]: numpy.newaxis is None
Out[2]: True

Los autores probablemente lo eligieron porque necesitaban una constante conveniente y Noneestaba disponible.

En cuanto a por qué se debe preferir newaxissobre None: principalmente es porque es más explícita, y en parte porque algún día los numpyautores podría cambiarlo a algo distinto None. (No planean hacerlo, y probablemente no lo harán, pero no hay una buena razón para preferirlo None).

AFoglia
fuente
Gracias, no me había dado cuenta de que np.newaxis es en realidad None. Iré con newaxis entonces.
nikow
7
De hecho, dicen que puede usar None, por lo que no pueden cambiarlo ahora: "El objeto newaxis se puede usar en la sintaxis básica de corte discutida anteriormente. None también se puede usar en lugar de newaxis".
endolito
5
Además, si trabaja con personas que no están familiarizadas con los detalles de la indexación numpy, parece que se vuelven locos cuando ven matrices desreferenciadas por "Ninguno"
Peter
1
Un lugar en el que Nonees mejor es la optimización de la velocidad de ejecución, ya que puede proporcionar un beneficio de tiempo muy pequeño. Pero normalmente deberías preferir np.newaxis.
godaygo
2
Por qué simplemente no usaron newaxis = object()(o el equivalente de nivel C) está más allá de mí ... usar Nonees bastante propenso a errores. Tenía una función con un error (una base returnque se suponía que devolvía una matriz booleana) y comencé a recibir errores debido a una falta de coincidencia de formas. Me tomó un tiempo darme cuenta de que indexar con Noneno solo genera un IndexError. Si hubieran usado un valor centinela "nuevo", habría evitado 30 minutos de intentar dar sentido al error ...
Giacomo Alzetta