Indexación de matrices de Numpy: ¿vista o copia? – ¿depende del alcance?
Considere las siguientes manipulaciones de arrays:
import numpy as np
def f(x):
x += 1
x = np.zeros(1)
f(x) # cambia `x`
f(x[0]) # no cambia `x`
x[0] += 1 # cambia `x`
¿Por qué x[0]
se comporta de manera diferente dependiendo de si += 1
ocurre dentro o fuera de la función f
?
¿Puedo pasar una parte del array a la función de manera que la función modifique el array original?
Edit: Si consideráramos =
en lugar de +=
, probablemente podríamos mantener el núcleo de la pregunta al mismo tiempo que nos deshacemos de cierta complejidad irrelevante.
davy.ai
El comportamiento de
x[0]
depende del hecho de que los objetosnumpy.ndarray
en Python son mutables y se pasan por referencia. Cuandox
se pasa a la funciónf
, la función modifica el objetonumpy.ndarray
original agregándole 1 a su valor. Sin embargo, cuando se pasax[0]
af
, se pasa como un entero simple (no como un objetondarray
), y el operador+=
crea un nuevo objeto entero con el valor dex[0]+1
, que luego se asigna ax[0]
pero no se actualiza en elndarray
.Para modificar una parte del objeto
ndarray
original, podemos pasar una porción del array a la función, comof(x[:1])
. Esto pasará el primer elemento del array como un objetondarray
a la función, y cualquier modificación realizada en este objeto se reflejará en el objetondarray
original.