当前位置: 首页 > 面试题库 >

numpy的就地操作(例如,“ + =”)如何工作?

桂志诚
2023-03-14
问题内容

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

给定以下内容:

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

我明白那个:

  • a[i] = x与相同a.__setitem__(i, x),直接分配给所指示的项目i
  • a += x与相同a.__iadd__(x),即会进行加法

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

a[i] += x

特别:

  1. 这和一样a[i] = a[i] + x吗?(这不是就地操作)
  2. 如果i是,在这种情况下是否有所不同:
    • 一个int指数,或
    • 一个ndarray
    • 一个slice对象

背景

我开始研究此问题的原因是在使用重复索引时遇到了非直觉的行为:

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.])

问题答案:

您需要意识到的第一件事是,a += x它并不完全映射到a.__iadd__(x),而是映射到a = a.__iadd__(x)。请注意,文档特别指出,就地运算符返回其结果,而不必这样做self(尽管实际上通常是这样)。这意味着a[i] += x简单地映射到:

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

因此,添加从 技术上讲 是就地进行的,但仅在临时对象上进行。但是__add__,创建的临时对象可能比调用的对象少一个。



 类似资料:
  • 应用程序具有上下文路径-->/spring-form-simple-project 因此,为了访问,我使用: 这个控制器又返回student.jsp,当提交这个student.jsp时,它用-->@RequestMapping(value=“/AddStudent”,method=RequestMethod.post)调用controller 任何关于这通常如何工作的指示都将是有帮助的。 谢谢!

  • 问题内容: 有人可以确切解释NumPy中的参数做什么吗? 我很困惑。 我正在尝试使用该功能 最初,我认为如果数组本身是3维,将返回三个元素,该元素由同一位置上所有嵌套项的总和组成。如果每个维度都包含五个维度,则我希望返回五个项目的结果,依此类推。 但是事实并非如此,文档也不能很好地帮助我(他们使用3x3x3数组,因此很难判断发生了什么) 这是我所做的: 显然,结果并不直观。 问题答案: 显然, 轴

  • 问题内容: 目前,我有一些这样的代码 我认为此代码 效率不高, 因为需要返回数组的副本而不是 就地修改ret 我想知道是否可以将numpy数组用于以下代码: 这样,效率会更高。有人对此有想法吗?谢谢! 问题答案: 想象一个numpy数组占据一个连续的内存块。现在想象一下其他对象,例如其他numpy数组,它们正占据着numpy数组左右两侧的内存。没有空间可以追加或扩展我们的numpy数组。numpy

  • 问题内容: 我已经学会了如何根据自己的好奇心来工作。 似乎最简单的功能最难翻译为代码(我理解代码)。对每种情况的每个轴进行硬编码很容易,但是我想找到一种动态算法,可以在任何轴上以n维求和。官方网站上的文档没有帮助(仅显示结果而不显示过程),并且很难浏览Python/ C代码。 注意: 我确实弄清楚了当对一个数组求和时,指定的轴是“已删除”,即,形状为(4,3,2)且轴为1的数组的总和会得出形状为的

  • 我不是100%清楚RxJs 5运算符是如何工作的,请参阅这里的最新文档。jsbin的问题在这里。 如果我创建一个由0到2组成的可观察序列,每个值间隔一秒钟: 如果我为这个可观察对象创建两个订户: 我在控制台中看到: 我原以为每个订阅都会订阅相同的可观察对象,但事实似乎并非如此!它就像订阅的行为创造了一个完全独立的可观察的! 但是如果运算符被添加到可观察的源: 然后我们得到: 如果没有,这就是我所期

  • 启动C 20时,原子的操作有等待操作和通知操作。但我不知道它们到底是怎么工作的。cppreference说: 执行原子等待操作。表现为它重复执行以下步骤: 比较此的值表示形式- 这些函数保证仅在值发生更改时返回,即使底层实现错误地解除了阻塞。 我不太明白这两个部分是如何相互关联的。这是否意味着如果值没有更改,那么即使我使用了notify\u one()/方法,函数也不会返回?这意味着该操作在某种程