qual è la differenza tra resize e reshape [duplicate]

Aug 31 2020

Stavo scrivendo una riga di codice e ne ottengo uno strano output.

a = np.arange(2,11).resize((3,3))
print(a)

a = np.arange(2,11).reshape((3,3)) 
print(a)

il primo mi dà Nessuno ma il secondo mi dà una matrice 3X3. ma quando scrivo il primo codice in righe separate non mi darà Nessuno

a = np.arange(2,11)
a.resize((3,3))
print(a)

qual è la differenza tra resize e reshape in questo caso e in quali sono le differenze in generale?

Risposte

6 yatu Aug 31 2020 at 08:26

Questo perché ndarray.resizemodifica la forma dell'array sul posto e poiché stai assegnando di nuovo a ate None, come un'operazione sul posto non restituisce nulla. reshaperestituisce invece una vista dell'array:

a = np.arange(2,11)
a.shape
#(10,)

a.resize((3,3))
a.shape
# (3, 3)

np.arange(2,11).reshape((3,3)).shape
# (3, 3)
AshishThapa Aug 31 2020 at 09:16

Sia il rimodellamento che il ridimensionamento cambiano la forma dell'array numpy; la differenza è che l'uso del ridimensionamento influirà sull'array originale mentre l'uso di reshape creerà una nuova istanza rimodellato dell'array.

Rimodellare:

     import numpy as np
     r = np.arange(16)
     
     print('original r: \n',r)
     print('\nreshaped array: \n',r.reshape((4,4)))
     print('\narray r after reshape was applied: \n',r)

produzione

original r: 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
 
reshaped array: 
[[ 0  1  2  3]
[ 4  5  6  7]
[ 8  9 10 11]
[12 13 14 15]]
 
array r after reshape was applied: 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]

Ridimensiona:

import numpy as np
r = np.arange(16)
 
print('original r: \n',r)
print('\nresized array: \n',r.resize((4,4)))
print('\narray r after resize was applied: \n',r)

produzione:

original r: 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
 
resized array: 
None
 
array r after resize was applied: 
[[ 0  1  2  3]
[ 4  5  6  7]
[ 8  9 10 11]
[12 13 14 15]]

Come puoi vedere reshape ha creato una nuova istanza rimodellata dei dati mentre l'originale r è rimasto invariato e come puoi vedere, resize non ha creato una nuova istanza di r, le modifiche sono state applicate direttamente all'array originale.