python - ¿Por qué numpy tiene una función correspondiente para muchos métodos ndarray?
arrays methods (3)
Como otros han señalado, las funciones y métodos de matriz NumPy con nombres idénticos a menudo son equivalentes (terminan llamando al mismo código subyacente). Uno podría preferirse sobre el otro si facilita la lectura.
Sin embargo, en algunos casos, los dos se comportan de manera ligeramente diferente.
En particular, el uso del método
ndarray
veces enfatiza el hecho de que el método está modificando la matriz en el lugar.
Por ejemplo,
np.resize
devuelve una
nueva
matriz con la forma especificada.
Por otro lado,
ndarray.resize
cambia la forma de la matriz en el lugar.
Los valores de relleno utilizados en cada caso también son diferentes.
Del mismo modo,
a.sort()
ordena la matriz en un lugar, mientras que
np.sort(a)
devuelve una copia ordenada.
Algunos ejemplos:
numpy.sum()
ndarray.sum()
numpy.amax()
ndarray.max()
numpy.dot()
ndarray.dot()
... y bastantes más. ¿Es para admitir algún código heredado, o hay una mejor razón para eso? Y, ¿elijo solo en función de cómo se ve mi código, o es una de las dos formas mejor que la otra?
Me imagino que uno podría querer que
numpy.dot()
use
reduce
(por ejemplo,
reduce(numpy.dot, A, B, C, D)
) pero no creo que eso sea tan útil para algo como
numpy.sum()
Desarrollando el comentario de Peter para la visibilidad:
Podríamos hacerlo más consistente eliminando métodos de ndarray y apegándonos solo a funciones. Pero esto es imposible porque rompería el código existente de todos los que usan métodos.
O bien, podríamos mover todas las funciones para que también sean métodos. Pero esto es imposible porque los nuevos usuarios y paquetes definen constantemente nuevas funciones. Además, continuar multiplicando estos métodos duplicados viola "debería haber una forma obvia de hacerlo".
Si pudiéramos retroceder en el tiempo, probablemente argumentaría por no tener estos métodos en ndarray en absoluto, y usar funciones exclusivamente. ... Entonces todo esto argumenta a favor del uso exclusivo de funciones
En la mayoría de los casos, el método es la versión compilada básica. La función utiliza ese método cuando está disponible, pero también tiene algún tipo de copia de seguridad cuando los argumentos no son una matriz. Ayuda a mirar el código y / o documentos de la función o método.
Por ejemplo, si en
Ipython
solicito mirar el código para el método de suma, veo que es un código compilado
In [711]: x.sum??
Type: builtin_function_or_method
String form: <built-in method sum of numpy.ndarray object at 0xac1bce0>
...
Refer to `numpy.sum` for full documentation.
Haga lo mismo en
np.sum
, obtengo muchas líneas de documentación más algún código de Python:
if isinstance(a, _gentype):
res = _sum_(a)
if out is not None:
out[...] = res
return out
return res
elif type(a) is not mu.ndarray:
try:
sum = a.sum
except AttributeError:
return _methods._sum(a, axis=axis, dtype=dtype,
out=out, keepdims=keepdims)
# NOTE: Dropping the keepdims parameters here...
return sum(axis=axis, dtype=dtype, out=out)
else:
return _methods._sum(a, axis=axis, dtype=dtype,
out=out, keepdims=keepdims)
Si llamo a
np.sum(x)
donde
x
es una matriz, termina llamando a
x.sum()
:
sum = a.sum
return sum(axis=axis, dtype=dtype, out=out)
np.amax
similar (pero más simple).
Tenga en cuenta que el
np.
formulario puede manejar un objeto que no es una matriz (que no tiene el método), por ejemplo, una lista:
np.amax([1,2,3])
.
np.dot
y
x.dot
muestran como función ''incorporada'', por lo que no podemos decir nada sobre la prioridad.
Probablemente ambos terminen llamando a alguna función subyacente de C.
np.reshape
es otro que delinea si es posible:
try:
reshape = a.reshape
except AttributeError:
return _wrapit(a, ''reshape'', newshape, order=order)
return reshape(newshape, order=order)
Entonces
np.reshape(x,(2,3))
es idéntico en funcionalidad a
x.reshape((2,3))
.
Pero la expresión
_wrapit
habilita
np.reshape([1,2,3,4],(2,2))
.
np.sort
devuelve una copia haciendo una ordenación in situ en una copia:
a = asanyarray(a).copy()
a.sort(axis, kind, order)
return a
x.resize
está integrado, mientras que
np.resize
termina haciendo un
np.concatenate
y
reshape
.
Si su matriz es una subclase, como matriz o enmascarada, puede tener su propia variante.
La acción de una matriz
.sum
es:
return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis)