python - numpy 的就地操作(例如 `+=` )如何工作?

标签 python numpy

基本问题是:在执行以下操作时会发生什么:a[i] += b?

鉴于以下情况:

import numpy as np
a = np.arange(4)
i = a > 0
i
= array([False,  True,  True,  True], dtype=bool)

我的理解是:

  • a[i] = xa.__setitem__(i, x)一样,直接赋值给i
  • a += xa.__iadd__(x) 相同,即原地加法

但是当我这样做时会发生什么:

a[i] += x

具体来说:

  1. 这和 a[i] = a[i] + x 一样吗? (这不是就地操作)
  2. 在这种情况下,如果 i 是:
    • int 索引,或者
    • 一个ndarray,或者
    • 一个切片对象

背景

我开始研究这个的原因是我在处理重复索引时遇到了一个非直觉的行为:

a = np.zeros(4)
x = np.arange(4)
indices = np.zeros(4,dtype=np.int)  # duplicate indices
a[indices] += x
a
= array([ 3.,  0.,  0.,  0.])

关于重复索引的更多有趣内容在 this question 中.

最佳答案

您需要意识到的第一件事是 a += x 并不完全映射到 a.__iadd__(x),而是映射到 a = a.__iadd__(x)。请注意 documentation具体说就地运算符返回它们的结果,这不一定是 self (尽管在实践中,它通常是)。这意味着 a[i] += x 平凡地映射到:

a.__setitem__(i, a.__getitem__(i).__iadd__(x))

因此,加法技术上发生在原地,但仅发生在临时对象上。不过,与调用 __add__ 相比,创建的临时对象仍然可能较少。

关于python - numpy 的就地操作(例如 `+=` )如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034672/

相关文章:

python - 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

python - 在 Xcode 下运行 virtualenv python

python - 缺少 Gensim doc2vec infer_vector 方法

python - 如何使用一个函数或 for 循环导入大量 csv 数据文件?

Python scikit-learn : Cannot clone object. .. 因为构造函数似乎没有设置参数

python - 处理 sklearn.preprocessing 上的缺失 (nan) 值

python - Pandas DataFrame 的 str 计数中的奇怪行为

python - 具有多个元素的数组的真值不明确?

python - 具有固定颜色渐变的 np.histogram2D

python - Numpy/Scipy 中大气数据的快速 3D 插值