在Numpy中使用数组时,resize和reshape有什么区别?

Ris*_*ena 17 python numpy

我刚开始使用"NumPy的",我试图理解之间的区别resizereshape数组.

Rah*_*ddy 16

重塑不会更改此处提到的数据.调整变化中的数据可以看出这里.

这里有些例子:

>>> numpy.random.rand(2,3)
array([[ 0.6832785 ,  0.23452056,  0.25131171],
       [ 0.81549186,  0.64789272,  0.48778127]])
>>> ar = numpy.random.rand(2,3)
>>> ar.reshape(1,6)
array([[ 0.43968751,  0.95057451,  0.54744355,  0.33887095,  0.95809916,
         0.88722904]])
>>> ar
array([[ 0.43968751,  0.95057451,  0.54744355],
       [ 0.33887095,  0.95809916,  0.88722904]])
Run Code Online (Sandbox Code Playgroud)

重塑后,阵列没有改变,但只输出一个临时数组重塑.

>>> ar.resize(1,6)
>>> ar
array([[ 0.43968751,  0.95057451,  0.54744355,  0.33887095,  0.95809916,
         0.88722904]])
Run Code Online (Sandbox Code Playgroud)

调整大小后,阵列改变了它的形状.

  • 由于OP没有指定,我会指出`ar.resize(rows,cols)`就地改变了初始数组,而`np.resize(ar,X)`只输出一个调整大小的数组,``ar "保持不变.另外,如果新的大小比原始的`ar`大,那么`ar.resize`在末尾添加零,而`np.resize`重复原始的'ar`. (4认同)

Gad*_*eek 9

一个主要区别是reshape() 不会更改您的数据,但 resize() 会更改它。resize() 首先容纳原始数组中的所有值。之后,如果有额外的空间(或新数组的大小大于原始数组),它会添加自己的值。正如@David 在评论中提到的, resize() 添加的值取决于它的调用方式。

您可以通过以下两种方式调用reshape()resize()运行。

numpy.resize()

ndarray.resize()-您正在调整大小ndarrayn维度数组在哪里。

您也可以类似地将 reshape 称为numpy.reshape()and ndarray.reshape()。但在这里,除了语法之外,它们几乎相同。

需要注意的一点是,reshape() 将始终尽可能地尝试返回一个视图,否则它将返回一个副本。此外,它无法确定何时将返回什么,但是您可以让您的代码在复制数据时引发错误。

对于 resize() 函数,numpy.resize()返回数组的新副本,而ndarray.resize()就地执行。但他们不去那view件事。

现在谈到额外元素的值应该是什么。从文档中,它说

如果新数组大于原始数组,则新数组将填充 a 的重复副本。请注意,此行为与 a.resize(new_shape) 不同,后者填充零而不是 a 的重复副本。

所以ndarray.resize()它是 value 0,但numpy.resize()它是数组本身的值(当然,任何可以适应新大小的东西)。下面的代码片段将说明这一点。

In [40]: arr = np.array([1, 2, 3, 4])

In [41]: np.resize(arr, (2,5))
Out[41]:
array([[1, 2, 3, 4, 1],
      [2, 3, 4, 1, 2]])

In [42]: arr.resize((2,5))

In [43]: arr
Out[43]:
array([[1, 2, 3, 4, 0],
       [0, 0, 0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

您还可以看到ndarray.resize()返回None并就地调整大小。


Mar*_*anD 5

  1. reshape()只能改变形状(即元信息), 而不是元素数量。

    如果数组有五个元素,我们可以使用例如reshape(5, ), reshape(1, 5),
    reshape(1, 5, 1),但不能使用 reshape(2, 3)

    • reshape()通常不要自己修改数据,只修改关于它们的元信息,

    • .reshape() 方法(的ndarray)返回重构阵列,保持原有的阵列不变。

  2. resize() 也可以改变形状和元素数量。

    因此,对于具有五个元素的数组,我们可以使用resize(5, 1), 但也可以使用resize(2, 2)resize(7, 9)

    • .resize() 方法(ndarray)返回None更改原始数组(因此它似乎是就地更改)。