qual é a diferença entre resize e reshape [duplicate]

Aug 31 2020

Eu estava escrevendo uma linha de código e recebo uma saída estranha dela.

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

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

o primeiro me dá Nenhum, mas o segundo me dá uma matriz 3X3. mas quando escrevo o primeiro código em linhas separadas, não me dá nenhum

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

qual é a diferença entre resize e reshape neste caso e em quais são as diferenças em geral?

Respostas

6 yatu Aug 31 2020 at 08:26

Isso ocorre porque ndarray.resizemodifica a forma da matriz no local e, como você está atribuindo de volta , aobtém None, já que uma operação local não retorna nada. reshapeem vez disso, retorna uma visualização da matriz:

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

Tanto a remodelação quanto o redimensionamento alteram a forma da matriz numpy; a diferença é que o uso de resize afetará a matriz original, enquanto o uso de reshape cria uma nova instância remodelada da matriz.

Remodelar:

     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)

resultado

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]

Redimensionar:

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)

resultado:

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]]

Como você pode ver, reshape criou uma nova instância remodelada dos dados enquanto o r original permaneceu inalterado. E, como você pode ver, resize não criou uma nova instância de r, as alterações foram aplicadas diretamente ao array original.