Numpy, la matriz no tiene sus propios datos?

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)