有没有一个经验法则可以知道在 numpy.ndarray
上哪些操作会产生值的 副本,哪些会就地修改它们呢?
我对 numpy 还比较陌生,肯定会走弯路,但我想知道是否有普遍的原则推动着可变性,这可能有助于加速我的学习。
有没有一个经验法则可以知道在 numpy.ndarray
上哪些操作会产生值的 副本,哪些会就地修改它们呢?
我对 numpy 还比较陌生,肯定会走弯路,但我想知道是否有普遍的原则推动着可变性,这可能有助于加速我的学习。
相对较少的numpy函数会在原地修改数组。大部分情况下,numpy函数返回数组视图,如果不能返回视图,则返回副本。
以下是一份详尽的列表(从文档中摘取)列出了能够在原地修改的函数/方法:
ndarray.resize
ndarray.sort
+=
,*=
,^=
等)numpy.fill_diagonal
numpy.random.shuffle
ndarray.partition
以下是一份可选地在原地修改的函数/方法列表:
ndarray.byteswap
numpy.nan_to_num
某些赋值语句也会在原地修改数组。您可以通过对切片进行赋值(例如arr[...] = 1
将数组中的每个值设置为1
)来更改数组中的值,并且您可以通过直接将新形状分配给.shape
来重新整形数组,例如arr.shape = (2,3)
(不总是有效,请参见此处的说明)。
还有一些支持out
关键字参数的函数。如果将同一数组作为输入和out
传递给这些函数,则它们将像变异体一样运行。
请注意,我可能会漏掉一两个没有在文档中明确标记的原地修改器。无论如何,列表很短,因此没有太多需要记忆的内容。
在过去几年中,numpy开发人员的目标之一似乎是使numpy函数和ndarray
方法更常见地返回视图而不是副本。现在,可以合理地假设,如果numpy函数/方法可以返回视图,则默认情况下会返回视图。
ndarray.flatten
和 ndarray.ravel
执行了相同的操作(返回一个扁平化的数组)。然而,`ndarray.flatten` 的文档明确表示它会返回一个副本,而`ndarray.ravel` 的文档则表示只在必要时才返回副本。.base
的 `id` 和原始数组的 `id` 来判断操作是否产生了视图或副本。例如:arr = np.array([[1, 2],
[3, 4],
[5, 6]])
arrflat = arr.flatten()
assert arrflat.base is not arr
arrravel = arr.ravel()
assert arrravel.base is arr