Intenté usar resize
en una matriz de esta manera:
a = np.array([1,2,3,4,5,6], dtype=np.uint8) a.resize(4,2) print a
y la salida es Ok! (quise decir que no hubo error). Pero cuando corro este código:
a = np.array([1,2,3,4,5,6], dtype=np.uint8).reshape(2,3) a.resize(4,2) print a
dio lugar a un error, diciendo que, ValueError: cannot resize this array: it does not own its data
Mi pregunta: ¿por qué después de aplicar la reshape
la propiedad de la matriz se cambia? ¿La propiedad se otorga a quién? ¡La reshape
no crea una nueva memoria y está realizando su operación en la misma memoria de matriz! Entonces, ¿por qué la propiedad va a cambiar?
Leí np.reshape y ndarray.resize doc pero no puedo entender la razón. Leí este post . Puedo verificar ndarray.flags
siempre antes de aplicar el método de cambio de resize
.
Vamos a empezar con lo siguiente:
>>> a = np.array([1,2,3,4,5,6], dtype=np.uint8) >>> b = a.reshape(2,3) >>> b[0,0] = 5 >>> a array([5, 2, 3, 4, 5, 6], dtype=uint8)
Puedo ver aquí que la matriz b
no es su propia matriz, sino simplemente una vista de a
(simplemente otra forma de entender el indicador “OWNDATA”). Para decirlo simplemente, a
y b
referencia a los mismos datos en la memoria, pero b
está viendo a
con una forma diferente. Llamar a la función de cambio de resize
como ndarray.resize
intenta cambiar la matriz en su lugar , ya que b
es solo una vista de esto, esto no está permitido desde la definición de cambio de resize
:
El propósito de la verificación de recuento de referencia es asegurarse de no usar esta matriz como un búfer para otro objeto de Python y luego reasignar la memoria.
Para evitar su problema, puede resize
desde numpy (no como un atributo de un ndarray) que detectará este problema y copiará los datos automáticamente:
>>> np.resize(b,(4,2)) array([[5, 2], [3, 4], [5, 6], [5, 2]], dtype=uint8)
Edición: como CT Zhu menciona correctamente, np.resize
y ndarray.resize
agregan datos de dos maneras diferentes. Para reproducir el comportamiento esperado como ndarray.resize
, tendría que hacer lo siguiente:
>>> c = b.copy() >>> c.resize(4,2) >>> c array([[5, 2], [3, 4], [5, 6], [0, 0]], dtype=uint8)