原地变异的函数
相对较少的 numpy 函数就地变异。在大多数情况下,numpy 函数在可以时返回数组视图,在不能时返回数组视图。
这是一份详尽的清单(来自the docs https://docs.scipy.org/doc/numpy-1.15.4/numpy-user-1.15.4.pdf) 就地变异的函数/方法:
ndarray.resize
ndarray.sort
- 所有就地二元运算符(例如
+=
, *=
, ^=
, etc)
numpy.fill_diagonal
numpy.random.shuffle
ndarray.partition
这是可以选择就地变异的函数/方法的列表:
ndarray.byteswap
numpy.nan_to_num
某些赋值也会就地改变数组。您可以通过分配给切片来更改数组中的值(例如arr[...] = 1
将数组中的每个值设置为1
),并且您可以通过直接分配新形状来重塑数组.shape
, eg arr.shape = (2,3)
(并不总是有效,请参阅注释here https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.reshape.html#numpy-reshape).
还有一些功能支持out
关键字参数。如果您传递相同的数组作为输入和变量,这些函数将充当变异器out
.
公平警告,我可能错过了文档中没有明确标记的一两个突变器。无论如何,这个列表很短,所以没有太多需要记住的东西。
关于查看与复制返回值的注释
过去几年 numpy 开发人员的目标之一似乎是让 numpy 函数和ndarray
方法返回视图而不是副本。此时,可以相当安全地假设如果 numpy 函数/方法can返回一个视图,默认情况下会这样做。
例如,ndarray.flatten
and ndarray.ravel
做同样的事情(返回一个扁平数组)。但是,那文档用于ndarray.flatten https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.flatten.html#numpy-ndarray-flatten明确表示它将返回一个副本,而文档用于ndarray.ravel https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.ndarray.ravel.html#numpy-ndarray-ravel说只有在绝对必要时才会返回副本。
在实时代码中,根据经验,您始终可以通过比较操作来检查操作是否生成视图或副本id
of the .base
你的结果到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