哪些 numpy 操作是复制的,哪些是变异的?

2024-01-12

是否有通用的经验法则来了解哪些操作numpy.ndarray产生一个copy哪些值会就地改变它们?

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


原地变异的函数

相对较少的 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪些 numpy 操作是复制的,哪些是变异的? 的相关文章

  • 如何在 numpy 中有效地实现 x[i][j] = y[i+j] ?

    Let x是形状为 A B 的矩阵并且y是一个大小为 A B 1 的数组 for i in range A for j in range B x i j y i j 如何使用 numpy 中的函数有效地实现等效代码 方法 1 Using S
  • 嵌套 NumPy 数组并使用拆分等方法

    我是 NumPy 的新手 正在尝试在我的代码中使用它来处理某些表 我有一个如下所示的坐标列表 coordinates 2 0 0 1 3 4 并想这样写 coordinatesNumpy np array 2 0 0 1 3 4 在常规 P
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 将 numpy.get_include() 参数添加到 setuptools 中,无需预安装 numpy

    我目前正在开发一个 python 包 它使用cython and numpy我希望可以使用以下命令安装该软件包pip install来自干净的 python 安装的命令 所有依赖项都应自动安装 我在用setuptools与以下setup p
  • numpy 向量化而不是 for 循环

    我用 Python 写了一些代码 运行良好 但速度很慢 我认为是由于 for 循环 我希望可以使用 numpy 命令加速以下操作 让我定义目标 假设我有一个 2D numpy 数组all CMs尺寸row x col 例如考虑一个6x11数
  • Numpy 与 Cython 速度

    我有一个分析代码 它使用 numpy 执行一些繁重的数值运算 只是出于好奇 尝试使用 cython 进行少量更改来编译它 然后我使用 numpy 部分的循环重写它 令我惊讶的是 基于循环的代码要快得多 8 倍 我无法发布完整的代码 但我整理
  • 将文件拆分为块

    我正在尝试分割格式为以下的文件 some garbage lines target G0 S0 type xy 0 108847E 02 0 489034E 04 0 108711E 02 0 491023E 04 0 108574E 02
  • Python:使用索引数组在两个数组之间进行映射

    我有一个 numpy 数组 src np random rand 320 240 和另一个 numpy 数组idx尺寸 2 x 320 240 每一列idx索引结果数组中的条目dst e g idx 20 3 10 引用第 3 行 第 10
  • 如何有效地从 loadmat 函数生成的嵌套 numpy 数组中提取值?

    python中是否有更有效的方法从嵌套的python列表中提取数据 例如A array array 12000000 dtype object 我一直在使用A 0 0 0 0 当你有很多像 A 这样的数据时 这似乎不是一个有效的方法 我也用
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 将一个时间序列插入到 pandas 中的另一个时间序列中

    我有一组定期测量的值 说 import pandas as pd import numpy as np rng pd date range 2013 01 01 periods 12 freq H data pd Series np ran
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i
  • 如何以干净高效的方式在 pytorch 中获得小批量?

    我试图做一件简单的事情 即使用火炬通过随机梯度下降 SGD 训练线性模型 import numpy as np import torch from torch autograd import Variable import pdb def
  • 重新排列 numpy 数组

    我正在尝试 就地 修改 numpy 数组 我感兴趣的是就地重新排列数组 而不是 return ing 数组的重新排列版本 这是一个示例代码 from numpy import def modar arr arr arr 1 0 commen
  • numpy.histogram() 是如何工作的?

    在阅读 numpy 时 我遇到了这个函数numpy histogram http docs scipy org doc numpy reference generated numpy histogram html 它的用途是什么以及它是如何
  • 将 RGB 转换为黑色或白色

    我如何在Python中获取RGB图像并将其转换为黑白图像 不是灰度 我希望每个像素要么是全黑 0 0 0 要么是全白 255 255 255 流行的 Python 图像处理库中是否有任何内置功能可以完成此任务 如果不是 最好的方法是循环遍历
  • 以间隔对包含 np.nan 的值进行分组

    我有一个包含零 一和 np nan 的 pandas 系列 import pandas as pd import numpy as np df1 pd Series 0 0 0 0 0 1 1 1 0 0 0 np nan np nan 1
  • 我可以使用文本叠加执行类似 imsave() 的操作吗?

    我在用imsave 依次制作许多 PNG 我将它们合并为 AVI 并且我想添加移动文本注释 我用ImageJ http imagej nih gov ij features html制作 AVI 或 GIF 我不需要轴 数字 边框或任何东西

随机推荐