我刚开始使用NumPy。在数组中,resize
和reshape
有什么区别?
如官方文档所述,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]])
调整数组大小后,它的形状发生了变化。
ar.resize(rows,cols)
会原地修改初始数组,而 np.resize(ar,X)
只会输出一个重置大小后的新数组,ar
保持不变。此外,如果新的大小比原始的 ar
大,ar.resize
会在末尾添加零,而 np.resize
会重复原始的 ar
。 - David Andrei Ned一个主要的区别是: 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
,并在原地进行调整大小。
reshape()
能够改变数组的形状,但是不能改变元素数量,只能修改元信息。
如果数组有五个元素,我们可以使用例如reshape(5,)
,reshape(1,5)
,
reshape(1,5,1)
,但不能使用reshape(2,3)
。
reshape()
通常不会修改数据本身,只会修改关于它们的元信息。
.reshape()
方法(属于ndarray)返回重塑后的数组,保留原始数组不受影响。
resize()
能够同时改变数组的形状和元素数量。
因此,对于一个有五个元素的数组,我们可以使用 resize(5, 1)
,也可以使用 resize(2, 2)
或 resize(7, 9)
。
.resize()
方法(属于ndarray)返回 None,仅更改原始数组(所以看起来像是就地修改)。另外一个要注意的地方是:
np.reshape函数可以在一个维度上使用-1来自动计算该维度的大小,而np.resize函数则不行。
下面给出一个例子:
arr = np.arange(20)
arr.resize(5, 2, 2)
arr.reshape(2, 2, -1)
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”地改变形状)。
sum(ndarray.shape)
andndarray.size
are the same afterndarray.reshape
. Those values will be different afterndarray.resize
- wwii