我刚开始使用"NumPy的",我试图理解之间的区别resize
和reshape
数组.
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)
调整大小后,阵列改变了它的形状.
一个主要区别是reshape() 不会更改您的数据,但 resize() 会更改它。resize() 首先容纳原始数组中的所有值。之后,如果有额外的空间(或新数组的大小大于原始数组),它会添加自己的值。正如@David 在评论中提到的, resize() 添加的值取决于它的调用方式。
您可以通过以下两种方式调用reshape()
和resize()
运行。
numpy.resize()
ndarray.resize()
-您正在调整大小ndarray
的n
维度数组在哪里。
您也可以类似地将 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
并就地调整大小。
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
,仅更改原始数组(因此它似乎是就地更改)。 归档时间: |
|
查看次数: |
17022 次 |
最近记录: |