Numpy 多维数组索引交换轴顺序

2024-01-06

我正在使用多维 Numpy 数组。我注意到在使用其他索引数组访问这些数组时存在一些不一致的行为。例如:

import numpy as np
start = np.zeros((7,5,3))
a     = start[:,:,np.arange(2)]
b     = start[0,:,np.arange(2)]
c     = start[0,:,:2]
print 'a:', a.shape
print 'b:', b.shape
print 'c:', c.shape

在这个例子中,我得到的结果是:

a: (7, 5, 2)
b: (2, 5)
c: (5, 2)

这让我很困惑。为什么“b”和“c”的尺寸不同?为什么“b”交换轴顺序,而不是“a”?

由于大量的单元测试,我已经能够围绕这些不一致的地方设计我的代码,但是了解正在发生的事情将不胜感激。

作为参考,我通过 MacPorts 使用 Python 2.7.3 和 Numpy 1.6.2。


从语法上来说,这看起来像是不一致的,但从语义上来说,你在这里做了两件截然不同的事情。在你的定义中a and b, 你正在做的高级索引 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing,有时称为花式索引 https://www.numpy.org/devdocs/user/quickstart.html#fancy-indexing-and-index-tricks,它返回数据的副本。在你的定义中c, 你正在做的基本切片 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing,它返回数据的视图。

为了区分其中的差异,有助于理解索引如何传递给 python 对象。这里有些例子:

>>> class ShowIndex(object):
...     def __getitem__(self, index):
...         print index
... 
>>> ShowIndex()[:,:]
(slice(None, None, None), slice(None, None, None))
>>> ShowIndex()[...,:]
(Ellipsis, slice(None, None, None))
>>> ShowIndex()[0:5:2,::-1]
(slice(0, 5, 2), slice(None, None, -1))
>>> ShowIndex()[0:5:2,np.arange(3)]
(slice(0, 5, 2), array([0, 1, 2]))
>>> ShowIndex()[0:5:2]
slice(0, 5, 2)
>>> ShowIndex()[5, 5]
(5, 5)
>>> ShowIndex()[5]
5
>>> ShowIndex()[np.arange(3)]
[0 1 2]

正如你所看到的,有many不同的可能配置。首先,可以传递单个项目,或者可以传递项目的元组。其次,元组可能包含slice物体,Ellipsis对象、普通整数或numpy数组。

当您通过时会激活基本切片only像这样的物体int, slice, or Ellipsis物体,或None(这与numpy.newaxis)。这些可以单独传递或以元组形式传递。以下是文档关于如何激活基本切片的说明:

当 obj 是切片对象(由括号内的 start:stop:step 表示法构造)、整数或切片对象和整数的元组时,会发生基本切片。省略号和 newaxis 对象也可以散布在这些对象中。为了保持与数值中常见用法的向后兼容,如果选择对象是包含切片对象、省略号对象或 newaxis 对象但没有整数数组或其他对象的任何序列(例如列表),也会启动基本切片。嵌入序列。

当您通过numpy数组、仅包含整数或包含任何类型的子序列的非元组序列,或者包含数组或子序列的元组。

有关高级索引和基本切片有何不同的详细信息,请参阅文档(链接到上面)。但在这个特殊情况下,我很清楚发生了什么。它与使用部分索引时的以下行为有关:

部分索引的规则是结果的形状(或设置中要使用的对象的解释形状)是 x 的形状,其中索引子空间替换为广播索引子空间。如果索引子空间彼此相邻,则广播索引空间直接替换 x 中的所有索引子空间。如果索引子空间被分隔(通过切片对象),则首先是广播索引空间,然后是 x 的切片子空间。

在你的定义中a,它使用高级索引,您可以有效地传递序列[0, 1]作为元组的第三项,并且由于没有发生广播(因为没有其他序列),所以一切都按预期发生。

在你的定义中b,还使用高级索引,您可以有效地通过two序列,[0],第一项(被转换为intp数组),以及[0, 1],第三项。这两个项目一起广播,结果与第三个项目具有相同的形状。然而,由于广播已经发生,我们面临着一个问题:我们在新形状元组中的哪里插入广播形状?正如文档所说,

索引子空间中没有明确的位置可以放置,因此它被附加到开头。

So the 2广播的结果被移动到形状元组的开头,产生明显的转置。

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

Numpy 多维数组索引交换轴顺序 的相关文章

  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • 将 transaction.commit_manually() 升级到 Django > 1.6

    我继承了为 Django 1 4 编写的应用程序的一些代码 我们需要更新代码库以使用 Django 1 7 并最终更新到 1 8 作为下一个长期支持版本 在一些地方它使用旧风格 transaction commit manually and
  • 如何在 Jupyter Notebook 中运行 Python 异步代码?

    我有一些 asyncio 代码在 Python 解释器 CPython 3 6 2 中运行良好 我现在想在具有 IPython 内核的 Jupyter 笔记本中运行它 我可以运行它 import asyncio asyncio get ev
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • Python中列表中两个连续元素的平均值

    我有一个偶数个浮点数的列表 2 34 3 45 4 56 1 23 2 34 7 89 我的任务是计算 1 和 2 个元素 3 和 4 5 和 6 等元素的平均值 在 Python 中执行此操作的快捷方法是什么 data 2 34 3 45
  • 更改 x 轴比例

    我使用 Matlab 创建了这个图 使用 matplotlib x 轴绘制大数字 例如 100000 200000 300000 我想要 1 2 3 和 10 5 之类的值来指示它实际上是 100000 200000 300000 有没有一
  • 编辑 Jupyter Notebook 时 VS Code 中缺少“在选择中查找”

    使用 Jupyter Notebook 时 VSCode 中缺少 在选择中查找 按钮 它会减慢开发速度 所以我想请问有人知道如何激活它吗 第一张图显示了在 python 文件中的搜索 替换 第二张图显示了笔记本电脑中缺少的按钮 Python
  • 设置 verify_certs=False 但 elasticsearch.Elasticsearch 因证书验证失败而引发 SSL 错误

    self host KibanaProxy 自我端口 443 self user 测试 self password 测试 我需要禁止证书验证 使用选项时它与curl一起使用 k在命令行上 但是 在使用 Elasticsearch pytho
  • 对使用 importlib.util 导入的对象进行酸洗

    我在使用Python的pickle时遇到了一个问题 我需要通过将文件路径提供给 importlib util 来加载一些 Python 模块 如下所示 import importlib util spec importlib util sp
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 为什么我应该使用 WSGI?

    使用 mod python 一段时间了 我读了越来越多关于 WSGI 有多好的文章 但没有真正理解为什么 那么我为什么要切换到它呢 有什么好处 这很难吗 学习曲线值得吗 为了用 Python 开发复杂的 Web 应用程序 您可能会使用更全面
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 使用 pybtex 将 bibtex 转换为格式化的 HTML 参考书目,例如哈佛风格

    我正在使用 Django 并将 bibtex 存储在我的模型中 并且希望能够以格式化 HTML 字符串的形式向我的视图传递引用 使其看起来像哈佛引用样式 使用中描述的方法Pybtex 无法识别 bibtex 条目 https stackov
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • OSX 上的 locale.getlocale() 问题

    我需要获取系统区域设置来执行许多操作 最终我想使用 gettext 翻译我的应用程序 我打算在 Linux 和 OSX 上分发它 但我在 OSX Snow Leopard 上遇到了问题 python Python 2 5 2 r252 60
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru

随机推荐

  • 外键中的循环依赖:使用还是避免?

    我的应用程序将数据库中的大量数据加载到复杂的数据结构中 内存中的数据结构类似于数据库的结构 这意味着如果数据库包含以下表 表A 键为A1 表 B 键为 B1 其中一列是表 A 的键 的外键 表 C 键为 C1 其中一列是表 B 的键 的外键
  • 如何在Android Studio中使用Google Cloud Translation API?

    我正在制作一个用于语言翻译的 Android 应用程序 到目前为止 我已经使用语音识别器意图将语音输入转换为字符串 现在我想将该字符串翻译成另一种语言 并使用 TTS 引擎说出翻译后的文本 我创建了一个单独的translate test文件
  • 如何将视图模型传递到布局/母版页?

    在谷歌搜索了一段时间后 我对如何在 asp mvc 3 中执行此操作有点困惑 因此 任务是为多个控制器的视图提供一个通用的布局 或主 页面 所有视图本身都是强类型的 这个布局页面实际上可视化了一些强类型对象 因此 我需要将此对象传递到布局页
  • 在 Matplotlib 中使用获取和设置轴方法的相对坐标

    控制位置的一种方法figure反对新的axes应该是通过使用add axes方法 此方法接受 4 个值的列表或元组 这些值表示 左 下 宽 高 其中所有数量均以图形宽度和高度的分数形式表示 例如 import matplotlib fig
  • 如何确定特定动画帧何时运行

    我想知道动画的某些帧何时运行以设置各种条件 在下面的代码中 如何使用计数器或设置条件来确定特定动画帧 例如第 3 帧和第 8 帧 当前正在运行的时间 NSMutableArray frameArray NSMutableArray arra
  • 从Python脚本解析PHP文件变量

    我需要从我的 Python 脚本的 PHP Wordpress 配置文件中获取一些数据 我如何解析配置数据 例如 我怎样才能得到 wp 版本价值 配置示例 The WordPress version string global string
  • Java中有没有办法在不传输或下载的情况下获取图像的宽度和高度?

    为了获得图像的高度 我们可以使用ImageIO read new URL getHeight https docs oracle com javase 8 docs api java awt image BufferedImage html
  • 将数字转换为 16 位浮点数(以字节形式存储)并返回?

    出于 有损 压缩的目的 我希望能够将 Javascript 数字转换为 16 位浮点表示形式 以存储在 Uint16Arrays 或 Uint8Arrays 以最简单的为准 中 然后我希望能够从2 个字节对应一个数字 我不需要对 16 位数
  • numpy.fft() 返回值幅值+相移或角度是多少?

    np fft fft 返回一个复数数组 复数的含义是什么 我想实部是振幅 虚部是相移 相位角 或者是其他东西 我发现数组中的位置代表频率 这并不是一个真正的编程问题 也不特定于numpy 简而言之 复数的绝对值 sqrt x real 2
  • 如何进行不区分大小写的字符串替换

    嗨朋友们我正在创建一个应用程序 我想在其中找到一个特定的单词ArrayList我必须更换用另一个词来说 我使用了下面的代码 它区分大小写 但我想让它不区分大小写 FillintheBlank class public class Filli
  • 使用 multer-s3 nodejs 将图像上传到亚马逊 s3

    我正在尝试使用将图像上传到亚马逊 s3multer s3 但我收到此错误 类型错误 预期 opts s3 为对象 node modules multer s3 index js 69 20 这是我的服务器代码 var upload mult
  • POM错误:找不到org.springframework.boot

    我一直在尝试设置一个春季启动项目但收到错误 我研究并尝试了各种选择 但到目前为止还没有运气 任何帮助 将不胜感激 项目构建错误 Non resolvable parent POM Failure to find org springfram
  • 在 sed 替换字符串中转义换行符

    这是我尝试更换b带有换行符的字符使用sed在跑步的时候bash gt echo abc sed s b n anc 不 不是那样的 gt echo abc sed s b n a nc 不 也不是这样 我想要的输出是 a c HELP 看起
  • 为什么 JSON.stringify 会搞砸我的日期时间对象?

    id 1533 story type id 1 content id 470 created at Sun 05 Feb 2012 07 02 43 GMT updated at Sun 05 Feb 2012 07 02 43 GMT t
  • Firebase 云功能与 Firestore 返回“已超出截止日期”

    我从 Firestore 文档中获取了示例函数之一 并能够从本地 firebase 环境成功运行它 但是 一旦我部署到 Firebase 服务器 该功能就会完成 但 Firestore 数据库中不会创建任何条目 firebase 函数日志显
  • CucumberJS:每一步后截图

    有谁知道如何截图everycucumberjs 中场景的步骤 并将其附加到 json 报告中 显然 这可以通过自定义报告器使用 Cucumber 事件处理程序来完成 browser takeScreenshot then png any g
  • 如何通过 Unity 和 DependencyResolver 使用会话值

    我正在使用 MVC4 和 Unity 2 1 我的服务需要基于从会话状态检索到的凭据的服务密钥 我像这样注册我的服务 container RegisterType
  • 如何在 Inno Setup 中记录文件复制过程

    在安装过程中 我需要将一些文件从文件夹复制到另一个文件夹 我如何确定此复制过程是否成功 FileCopy ExpandConstant src copy txt ExpandConstant app test success txt fal
  • 重载方法调用重载方法

    我正在编写一个方法 该方法正在调用其中的另一个重载方法 我只想编写一种外部方法 因为外部方法的参数正在传递给内部方法 有没有办法做到这一点 我尝试使用泛型 但我对此了解不够 所以它不起作用 public void OuterMethod
  • Numpy 多维数组索引交换轴顺序

    我正在使用多维 Numpy 数组 我注意到在使用其他索引数组访问这些数组时存在一些不一致的行为 例如 import numpy as np start np zeros 7 5 3 a start np arange 2 b start 0