python arrays numpy methods built-in

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

github.com/numpy/numpy/issues/7452


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)