哪些numpy操作复制哪些变异?

哪些numpy操作复制哪些变异?,numpy,Numpy,是否有一个一般的经验法则来知道numpy.ndarray上的哪些操作会生成值的副本,以及哪些操作会对它们进行适当的变异 我对numpy还很陌生,我相信最终我会以艰苦的方式学习,但我想知道是否有一些驱动可变性的一般原则可以帮助我加快学习速度。在适当的地方发生变异的函数 相对较少的numpy函数在适当的位置发生变异。在大多数情况下,numpy函数可以返回数组视图,不能返回时返回副本 下面是一个详尽的列表(从中拖网),其中列出了在适当位置发生变化的函数/方法: ndarray.resize ndar

是否有一个一般的经验法则来知道
numpy.ndarray
上的哪些操作会生成值的副本,以及哪些操作会对它们进行适当的变异

我对numpy还很陌生,我相信最终我会以艰苦的方式学习,但我想知道是否有一些驱动可变性的一般原则可以帮助我加快学习速度。

在适当的地方发生变异的函数 相对较少的numpy函数在适当的位置发生变异。在大多数情况下,numpy函数可以返回数组视图,不能返回时返回副本

下面是一个详尽的列表(从中拖网),其中列出了在适当位置发生变化的函数/方法:

  • ndarray.resize
  • ndarray.sort
  • 所有就地二进制运算符(例如
    +=
    *=
    ^=
    等)
  • numpy.fill\u对角线
  • numpy.random.shuffle
  • ndarray.partition
下面是一个函数/方法列表,这些函数/方法可以选择在适当的位置进行变异:

  • ndarray.byteswap
  • numpy.nan\u to\u num
某些赋值也会在适当的位置改变数组。您可以通过指定一个切片来更改数组中的值(例如
arr[…]=1
将数组中的每个值设置为
1
),并且您可以通过将新形状直接指定给
.shape
,来重塑数组的形状,例如
arr.shape=(2,3)
(不总是有效,请参见注释)

还有一些函数支持
out
关键字arg。如果您将同一数组作为输入和
输出传递,则这些函数将起到变异器的作用

公平的警告,我可能遗漏了一两个文档中没有明确标记的突变。无论如何,这个清单很短,所以没有太多要记住的

关于查看与复制返回值的说明 近几年来,numpy开发人员的目标之一似乎是使numpy函数和
ndarray
方法更普遍地返回视图而不是副本。在这一点上,假设一个numpy函数/方法可以返回一个视图,那么默认情况下它会这样做,这是相当安全的

例如,
ndarray.flant
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

我不确定他问的是视图还是副本。这两个都是新的数组对象。真正的就地numpy操作并不多。我能想到的只有直接形状赋值、就地排序、调整大小、+=样式数学和索引赋值。没有明显的经验法则,但变量列表很短。我想我的答案中几乎有完整的列表,所以如果有任何困惑,请在这里查阅?@tel我认为我的经验法则是“几乎从不变异”和“几乎总是返回一个视图”,这对我的起步非常有帮助。潜在的问题是避免无意中更改我希望视为不可变的内容(因为其他方法也会使用它),并避免不必要的性能损失。在你回答之前,我没有做过视图和副本的区别,所以这也是一个非常有用的见解:)我认为,数组就像是一个映射到“基”中,在现有的基上创建一个新的映射是轻量级的,这本质上就是创建一个视图。我要补充的唯一一点是,有些数组是“基”,从某种意义上说,它们对其底层内存缓冲区具有正式的所有权。谢天谢地,在绝大多数情况下,数组是否拥有自己的数据几乎没有区别(不过,另一条经验法则是:拥有自己数据的数组上的操作“更有可能”返回视图而不是副本(尽管在很多情况下,视图上的操作确实会返回视图))。