通常情况下,当numpy看起来有重复的函数时,往往会有某种独特的用途需要使用其中一种。
我正在试图弄清楚是否存在任何情况需要使用flatten()
而不是reshape(-1)
。
flatten
返回数组的一个副本。如果可能,reshape
将返回一个视图。
例如,如果y = x.reshape(-1)
是一个视图,则修改y
也会修改x
:
In [149]: x = np.arange(3)
In [150]: y = x.reshape(-1)
In [151]: y[0] = 99
In [152]: x
Out[152]: array([99, 1, 2])
但是由于y = x.flatten()
是一个拷贝,修改y
永远不会修改x
:
In [153]: x = np.arange(3)
In [154]: y = x.flatten()
In [155]: y[0] = 99
In [156]: x
Out[156]: array([0, 1, 2])
下面是一个reshape
返回副本而不是视图的例子:
In [161]: x = np.arange(24).reshape(4,6)[::2, :]
In [163]: y = x.reshape(-1)
In [164]: y[0] = 99
In [165]: x
Out[165]:
array([[ 0, 1, 2, 3, 4, 5],
[12, 13, 14, 15, 16, 17]])
由于对 y
进行赋值不会影响 x
,因此我们知道 y
是 x
的副本,而不是视图。
x.reshape(-1)
可能会返回一个副本。 - unutbunp.reshape
文档中提到了另一种方法arr.shape=-1
,它可以原地操作,并在无法进行无复制重塑时引发错误。 - hpaulj
np.ravel
(以及它的方法)。我倾向于使用它;它的行为更接近于reshape
。 - hpaulj