哪些numpy操作会复制,哪些会发生突变?

时间:2018-11-11 04:08:55

标签: numpy

是否有一般的经验法则来知道numpy.ndarray上的哪些操作会产生值的副本,以及哪些会在原位对其进行突变?

我对numpy还是很陌生,我敢肯定我最终会学到困难的方法,但是我想知道是否存在驱动可变性的通用原则可以帮助加快学习速度。

1 个答案:

答案 0 :(得分:2)

可在原处变异的功能

相对而言,很少有numpy函数发生突变。在大多数情况下,numpy函数会在可能的情况下返回数组视图,而在不能的情况下返回数组视图。

以下是在适当位置发生变化的函数/方法的详尽列表(从the docs拖出):

  • ndarray.resize
  • ndarray.sort
  • 所有就地算术运算符(例如+=*=/=等)
  • numpy.fill_diagonal
  • numpy.random.shuffle
  • ndarray.partition

,这是可以随意替换的功能/方法的列表:

  • ndarray.byteswap
  • numpy.nan_to_num

某些分配也将改变数组的位置。您可以通过分配一个切片来更改数组中的值(例如arr[...] = 1会将数组中的每个值都设置为1),还可以通过将新形状直接分配给{{ 1}},例如.shape(并非总是有效,请参见注释here)。

还有一些功能支持arr.shape = (2,3)关键字arg。如果您传递与input和out相同的数组,则这些函数将充当mutator。

警告,我可能错过了一个或两个未在文档中明确标记的变种器。无论如何,该列表都很短,因此记住的内容不多。

关于视图和副本返回值的注释

在过去几年中,numpy开发人员的目标之一似乎是使numpy函数和out方法返回视图而不是副本变得更加普遍。在这一点上,可以合理地假设,如果numpy函数/方法可以返回视图,则默认情况下会返回视图。

例如,ndarrayndarray.flatten做同样的事情(返回一个扁平化的数组)。但是,docs for ndarray.flatten明确表示它将返回副本,而docs for ndarray.ravel则表示仅在绝对必要时才返回副本。

在实时代码中,通常可以通过将结果ndarray.ravel的{​​{1}}与id进行比较来检查操作是否生成了视图或副本原始数组。例如:

.base