numpy 的花式索引是如何实现的?

2024-04-18

我正在对 2D 列表和 numpy 数组进行一些实验。由此,我提出了三个我很想知道答案的问题。

首先,我初始化了一个 2D python 列表。

>>> my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

然后我尝试用元组索引列表。

>>> my_list[:,]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple

既然口译员向我抛出了一个TypeError而不是一个SyntaxError,我猜测实际上可以做到这一点,但是python本身并不支持它。

然后我尝试将列表转换为numpy数组并做同样的事情。

>>> np.array(my_list)[:,]
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

当然没问题。我的理解是其中之一__xx__()方法已被覆盖并在numpy包裹。

Numpy 的索引也支持列表:

>>> np.array(my_list)[:,[0, 1]]
array([[1, 2],
       [4, 5],
       [7, 8]])

这提出了几个问题:

  1. Which __xx__方法已重写/定义 numpy 来处理花哨的索引吗?
  2. 为什么 python 列表本身不支持花哨的索引?

(额外问题:为什么我的计时显示 python2 中的切片比 python3 慢?)


你有三个问题:

1. 哪个__xx__方法已重写/定义 numpy 来处理花哨的索引吗?

索引运算符[]可以使用覆盖__getitem__, __setitem__, and __delitem__。编写一个提供一些内省的简单子类可能很有趣:

>>> class VerboseList(list):
...     def __getitem__(self, key):
...         print(key)
...         return super().__getitem__(key)
...

我们先做一个空的:

>>> l = VerboseList()

现在用一些值填充它。请注意,我们还没有覆盖__setitem__所以还没有发生任何有趣的事情:

>>> l[:] = range(10)

现在让我们获取一个项目。在索引处00:

>>> l[0]
0
0

如果我们尝试使用元组,我们会收到错误,但我们首先可以看到元组!

>>> l[0, 4]
(0, 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __getitem__
TypeError: list indices must be integers or slices, not tuple

我们还可以了解Python内部是如何表示切片的:

>>> l[1:3]
slice(1, 3, None)
[1, 2]

您可以用这个对象做更多有趣的事情 - 尝试一下!

2. 为什么Python列表本身不支持花哨的索引?

这很难回答。思考这个问题的一种方式是历史性的:因为numpy开发人员首先想到了它。

你们这些年轻人。当我还是孩子的时候...

自 1991 年首次公开发布以来,Python 并没有numpy库,并且要创建多维列表,您必须嵌套列表结构。我认为早期的开发者——尤其是 Guido van Rossum(GvR https://en.wikipedia.org/wiki/Guido_van_Rossum)——最初觉得让事情保持简单是最好的。切片索引已经非常强大了。

然而,不久之后,人们对使用 Python 作为科学计算语言的兴趣与日俱增。 1995 年至 1997 年间,许多开发人员合作开发了一个名为numeric, 的早期前身numpy。虽然他不是主要贡献者numeric or numpy, GvR 与numeric开发人员扩展了 Python 的切片语法,使多维数组索引更容易。后来,有一个替代方案numeric出现称为numarray; 2006 年,numpy的创建,结合了两者的最佳功能。

这些库很强大,但它们需要大量的 c 扩展等等。将它们添加到基本的 Python 发行版中会使其变得庞大。尽管 GvR 确实稍微增强了切片语法,但向普通列表添加奇特的索引会极大地改变它们的 API,而且有些多余。考虑到外部库已经可以提供精美的索引,其好处不值得付出代价。

Parts of this narrative are speculative, in all honesty.1 I don't know the developers really! But it's the same decision I would have made. In fact...

确实应该这样。

尽管花式索引非常强大,但我很高兴即使在今天它也不是普通 Python 的一部分,因为这意味着您在使用普通列表时不必费力思考。对于许多任务来说,你并不需要它,而且它带来的认知负担是巨大的。

请记住,我正在谈论施加的负载readers and 维护者。你可能是一个天才,可以在头脑中计算 5 维张量积,但其他人必须阅读你的代码。保留精美的索引numpy意味着人们不会使用它,除非他们确实需要它,这使得代码总体上更具可读性和可维护性。

3.为什么numpy花式索引在python2上这么慢?是因为我在此版本中没有对 numpy 的原生 BLAS 支持吗?

可能吧。这绝对取决于环境;我在我的机器上没有看到相同的差异。


1. The parts of the narrative that aren't as speculative are drawn from a brief history https://www.computer.org/csdl/mags/cs/2011/02/mcs2011020009.html told in a special issue of Computing in Science and Engineering (2011 vol. 13).

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

numpy 的花式索引是如何实现的? 的相关文章

  • python 中的并行处理

    在 python 2 7 中进行并行处理的简单代码是什么 我在网上找到的所有示例都很复杂 并且包含不必要的代码 我该如何做一个简单的强力整数分解程序 在每个核心 4 上分解 1 个整数 我真正的程序可能只需要2个核心 并且需要共享信息 我知
  • 用缺失的日期填充其他列 Nan Pandas DataFrame

    我实际上是从几个 Excel 文件中提取数据来监控我的每日卡路里摄入量 我设法使用列表理解来生成日期 我尝试使用合并或连接 但它不起作用 ValueError 您正在尝试合并对象和 float64 列 date list 2021 05 2
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • Python新式类和__subclasses__函数

    有人可以向我解释为什么这有效 在 Python 2 5 中 class Foo object pass class Bar Foo pass print Foo subclasses 但这不是 class Foo pass class Ba
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 将文本拆分为数组,同时保留 Swift 中的标点符号

    我想将文本拆分为一个数组 保持标点符号与其余单词分隔开 因此字符串如下 Hello I am Albert Einstein 应该变成这样的数组 Hello I am Albert Einstein 我尝试过sting components
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • 谷歌地图上 100k 或更多标记,无需聚类

    我有一些通过安装在汽车上的 GPS 设备收集的数据 所以我拥有的数据基本上都位于街道 道路上 周围 每个坐标都有一些值 数据的格式是这样的 lat long value 12 979155 77 644925 6 12 97916833 7
  • PostgreSQL 列名区分大小写吗?

    我有一个数据库表 persons在另一个团队传下来的 Postgres 中 有一个列名 first Name 现在我尝试使用 PG Commander 来查询这个表的这个列名 select from persons where first
  • 使用 javascript 匹配电话国家/地区代码

    我正在尝试实现一个 JavaScript 函数来替换电话号码的国家 地区代码部分 输入是 90 533 333 33 33 我想用javascript替换 90部分 我尝试编写正则表达式 但没有成功 a z s 编辑 最终解决方案 ddlC
  • 删除媒体样式表上的 a:hover?

    如何删除媒体查询 CSS 文件中主 CSS 文件中指定的样式条目 例如 我想删除 a hover 条目以在触摸设备上使用 主要 css a hover color 999999 background 111111 如何在 media css
  • 日期未保存在mysql数据库中

    我在 MySQL 数据库中保存日期时遇到问题 测试一切 我正在尝试将 2010 01 01 例如 保存在 MySQL 数据库中 首先 我将 MySQL 字段设置为最新 这不起作用 但是当我将字段设置为字符串类型时 它确实将日期保存在数据库中
  • gulp compass 创建一个不需要的文件而不是仅使用流

    这是我的应用程序指南针吞咽任务 var compass require gulp compass var autoprefixer require gulp autoprefixer gulp task app compass functi
  • 更改不同值的单元格颜色 - Gridview

    我需要区分两个连续的单元格 一行中的每个值 如果它们具有不同的值 则在将值绑定到网格视图时 因此 如果在第 1 行中我有单元格 ABC 在第 2 行中我有单元格 CBA 我需要用不同的颜色为每个单元格着色 最好的方法是什么 这称为条件格式
  • 什么是渐进增强?

    Jeff 在谈论使用 JQuery 编写 stackoverflow 时提到了 渐进增强 的概念 经过快速谷歌之后 我发现了一些关于它的高层讨论 谁能推荐一个作为程序员开始的好地方 具体来说 我一直在用 PHP 编写 Web 应用程序 并希
  • 如何解锁 Eclipse 4.2 (Juno) 中的工具栏

    我从 Eclipse Indigo 3 7 迁移到 Juno 4 2 在 Juno 中 所有工具栏似乎都被永久锁定 有没有办法解锁它们以便可以移动或重新排列它们 尝试 Windows 首选项 外观 看打印 然后在搜索框中输入 主题 或转到
  • 使用 R 代码的移动平均线

    我需要 R 代码的第一部分是 编写一个执行以下操作的 R 函数 给定一个序列 xN x1 x2 xN of N 观察 该函数返回一个移动平均值向量 其中计算每个平均值 k 个连续观察值 将函数命名为 ma 其参数为 向量 xN 和 k 到目
  • 基于文件类型的应用程序选择对话框

    我正在尝试创建一个对话框 它将显示打开给定文件类型的可用应用程序列表 我一直在 stackoverflow 上查看一些解决相同问题的问题 但由于缺乏答案而迷失了方向 我特别关注这个问题 在 Android 中 如何根据文件类型显示应用程序选
  • 使用 jquery post for mvc 3 在部署时不起作用

    所以我有这个 MVC 3 应用程序 它有一个下拉列表 我用它通过 jquery 填充 div 它在本地工作正常 但当我将其部署到服务器时 它重定向不正确 这是我的 jquery ddlCategoryMain change function
  • 将 mm/dd/yyyy 转换为 yyyymmdd (VB.NET)

    有什么方法可以将日期格式 dd mm yyyy 转换为 yyyymmdd 格式吗 例如从 25 07 2011 到 20110725 在 VB NET 中 日期本身不have固有的格式 您可以将字符串解析为DateTime通过解析它dd M
  • 如何在bash函数中显示数字到小数点后两位

    我应该如何获取以百分之秒为单位的数字并将其以秒为单位显示到小数点后两位 我不确定遵循 dTime 函数的伪代码 但我认为您会得到我的目标 function time echo date N 10000000 function dTime e
  • 用于存储用户位置历史记录的 MongoDB 架构

    我想使用 MongoDB 来存储我的用户位置历史记录 当然要征得他们的同意 我看到以下三个选项 为所有用户创建一个位置集合 每个文档都有一个 userId 字段和一个时间字段 这两个字段都将被索引 该集合中的行数可能会增长到超过 1 亿行
  • 绑定到 Date() 对象时如何格式化 input[time] 的值

    我将变量绑定到时间类型的输入字段 但显示的格式错误 它显示时间如下 08 54 30 088我真正需要的是这样的格式 08 54 我尝试使用过滤器设置输入字段的值 value datetime date date HH mm 但我的编辑说我
  • 为什么Windows和Linux的标准库函数名称不同?

    我正在将 Windows 库移植到 Android 使用 GNU 标准 C 库选项 libstdc v3 VC 和 GNU 库之间似乎存在许多命名差异 例如 stricmp叫做strcasecmp instead unlink叫做unlin
  • 使用 Sharepoint 事件接​​收器在文档库中创建文件夹

    我使用以下代码在文档库中创建一个文件夹 该事件被触发并执行到我的代码的最后一行 没有任何问题 但是 该文件夹未在我的文档库中创建或列出 public override void ItemAdded SPItemEventProperties
  • 如何在javascript中处理(® ´ © ¿ ¡ ° À ) 特殊字符?

    我需要开发一个 javascript 函数 不允许字符串中出现特殊字符 问题是IE8无法识别字符串中的特殊字符 并且在使用indexOf 方法时返回 1 处理这些特殊字符的正确方法是什么 只要您的所有编码都是正确的 您是否将文件另存为 UT
  • numpy 的花式索引是如何实现的?

    我正在对 2D 列表和 numpy 数组进行一些实验 由此 我提出了三个我很想知道答案的问题 首先 我初始化了一个 2D python 列表 gt gt gt my list 1 2 3 4 5 6 7 8 9 然后我尝试用元组索引列表 g