python - numpy.r_ no es una función. ¿Qué es?


1 Answers

Yo diría que, para todos los propósitos, r_ es una función, pero una implementada por un truco inteligente que usa una sintaxis diferente. Mike ya explicó cómo r_ en realidad no es una función, sino una instancia de clase de RClass , que tiene __getitem__ implementado, para que pueda usarlo como r_[1] . La diferencia estética es que utiliza corchetes en lugar de curvos, por lo que no está haciendo una llamada de función, pero en realidad está indexando el objeto. Aunque esto es técnicamente cierto, para todos los propósitos, funciona como una llamada a función, pero permite una sintaxis extra no permitida por una función normal.

La motivación para crear r_ probablemente proviene de la sintaxis de Matlab, que permite construir matrices de una manera muy compacta, como x = [1:10, 15, 20:10:100] . Para lograr lo mismo en numpy, tendrías que hacer x = np.hstack((np.arange(1,11), 15, np.arange(20,110,10))) . El uso de dos puntos para crear rangos no está permitido en Python, pero existen en forma de notación de división para indexar en una lista, como L[3:5] e incluso A[2:10, 20:30] para múltiples matrices tridimensionales. Debajo del capó, la notación de índice se transforma en una llamada al método __getitem__ del objeto, donde la notación de dos puntos se transforma en un objeto de división:

In [13]: class C(object):
    ...:     def __getitem__(self, x):
    ...:         print x

In [14]: c = C()

In [15]: c[1:11, 15, 20:110:10]
(slice(1, 11, None), 15, slice(20, 110, 10))

El objeto r_ 'abusa' de este hecho para crear una 'función' que acepta la notación de división, que también hace algunas cosas adicionales como concatenar todo junto y devolver el resultado, para que pueda escribir x = np.r_[1:11, 15, 20:110:10] . La "función No es así, no requiere parámetros" en la documentación es ligeramente engañosa ...

python function numpy

De acuerdo con el documento numpy / scipy en numpy.r_ here , "no es una función, por lo tanto no toma parámetros".

Si no es una función, ¿cuál es el término adecuado para "funciones" como numpy.r_ ?



Related