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

问题描述 投票:10回答:3

我刚刚开始使用'NumPy',我试图了解resizereshape之间的差异。

python numpy
3个回答
12
投票

重塑不会改变here提到的数据。调整大小可以看到更改数据here

这里有些例子:

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

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


1
投票

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

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

numpy.resize()

ndarray.resize() - ndarrayn维数阵,你正在调整大小。

您可以类似地调用reshape作为numpy.reshape()ndarray.reshape()。但除了语法之外,它们几乎相同。

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

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

现在到了什么应该是额外元素的价值。它说,来自文档

如果新数组大于原始数组,则新数组将填充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并进行就地调整大小。


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')。

© www.soinside.com 2019 - 2024. All rights reserved.