何时使用`flatten()`而不是`reshape(-1)`?

7

通常情况下,当numpy看起来有重复的函数时,往往会有某种独特的用途需要使用其中一种。

我正在试图弄清楚是否存在任何情况需要使用flatten()而不是reshape(-1)


3
还有另一个选择,np.ravel(以及它的方法)。我倾向于使用它;它的行为更接近于reshape - hpaulj
1个回答

10

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,因此我们知道 yx 的副本,而不是视图。


所以第三个例子是虚构的,目的是为了展示视图和副本之间的区别?reshape 不可能返回一个副本吗? - SantoshGupta7
这不是虚构。(但别只听我说,请自己尝试!)当没有单个常量可以描述1D数组的步幅时,x.reshape(-1)可能会返回一个副本。 - unutbu
1
@SantoshGupta7,np.reshape文档中提到了另一种方法arr.shape=-1,它可以原地操作,并在无法进行无复制重塑时引发错误。 - hpaulj
expand_dims()是什么? - skan

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