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

31

我刚开始使用NumPy。在数组中,resizereshape有什么区别?


2
你有尝试过做任何研究吗? - TigerhawkT3
sum(ndarray.shape) and ndarray.size are the same after ndarray.reshape. Those values will be different after ndarray.resize - wwii
这不是完全重复,但它可能会有所帮助:https://dev59.com/6J3ha4cB1Zd3GeqPTmSh - hpaulj
5个回答

28

如官方文档所述,reshape不会改变数据:这里。 而resize则会修改数据,具体可以在这里看到。

以下是一些示例:

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

重新调整数组大小后,原数组并未改变,只是输出了一个临时的重塑数组。

>>> ar.resize(1,6)
>>> ar
array([[ 0.43968751,  0.95057451,  0.54744355,  0.33887095,  0.95809916,
         0.88722904]])

调整数组大小后,它的形状发生了变化。


8
因为 OP 没有说明,我来指出 ar.resize(rows,cols) 会原地修改初始数组,而 np.resize(ar,X) 只会输出一个重置大小后的新数组,ar 保持不变。此外,如果新的大小比原始的 ar 大,ar.resize 会在末尾添加零,而 np.resize 会重复原始的 ar - David Andrei Ned

10

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

您可以以以下两种方式调用reshape()resize()函数。

numpy.resize()

ndarray.resize() - 其中ndarray是您要调整大小的n维数组。

同样,您也可以像numpy.reshape()ndarray.reshape()一样调用reshape。但是,在这里它们几乎相同,除了语法。

需要注意的一点是,reshape()将始终尝试在可能情况下返回视图,否则它将返回副本。它也无法确定何时返回什么,但是您可以使您的代码在数据被复制时引发错误。 对于resize()函数,numpy.resize()会返回一个新的数组副本,而ndarray.resize()则是就地执行。但是,它们不会采用“视图”概念。

现在来到额外元素的值应该是什么的问题。从文档中可以看出,它说

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

因此,对于ndarray.resize(),它的值为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]])

你也可以看到ndarray.resize()返回None,并在原地进行调整大小。


8
  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,仅更改原始数组(所以看起来像是就地修改)。

0

另外一个要注意的地方是:

np.reshape函数可以在一个维度上使用-1来自动计算该维度的大小,而np.resize函数则不行。

下面给出一个例子:

arr = np.arange(20)
arr.resize(5, 2, 2)
arr.reshape(2, 2, -1)

0
假设您有以下np.ndarray:
a = np.array([1, 2, 3, 4]) # Shape of this is (4,)

现在我们尝试使用'a.reshape'

a.reshape(1, 4)

array([[1, 2, 3, 4]])

a.shape         # This will again return (4,)

我们看到 a 的形状没有改变。

现在让我们尝试 'a.resize':

a.resize(1,4)

a.shape         # Now the shape changes to (1,4)

'resize' 改变了我们原始的 NumPy 数组 a 的形状(它会“IN-PLACE”地改变形状)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接