【发布时间】:2020-12-23 07:25:41
【问题描述】:
问题
关于 Numpy Indexing 可以返回副本或查看,请确认我的理解是否正确。如果不是,请提供解释并提供相关规范的指针。
问:基本切片
Numpy 索引 documentation 有 Basic Slicing and Indexing 部分。我相信本节只讨论Indexing 中提到的三种方式之一的基本切片。
共有三种可用的索引:字段访问、基本切片、高级索引。发生哪一个取决于 obj。
它只使用Python slice object 并且只返回视图。即使切片在元组中,可能属于下面的部分,它仍然返回视图。
如果向索引提供一个元组,则该元组将被解释为索引列表。
此代码将返回一个视图。
>>> indices = (1,1,1,slice(0,2)) # same as [1,1,1,0:2]
>>> z[indices]
array([39, 40])
这些都是正确的理解吗?
问:结合基本切片和高级索引
文档中有一段:
当索引中至少有一个切片 (:)、省略号 (...) 或 newaxis(或数组的维度多于高级索引)时,行为可能会更复杂。
我相信,部分标题中的basic indexing意味着basic slicing。没有这样的basic indexing 与基本切片不同,因为Indexing 表示只有三种方式,field access, basic slicing, advanced indexing。
当高级索引和基本索引结合时,它会返回副本。
这些理解正确吗?
背景
Numpy 索引有很多选项,有的返回视图,有的返回副本。有一个清晰的心理分类,哪个操作可能返回引用/视图或复制是相当混乱的。
共有三种可用的索引:字段访问、基本切片、高级索引。发生哪一个取决于 obj。
当 obj 是切片对象(由括号内的 start:stop:step 表示法构造)、整数或切片对象和整数的元组时,就会发生基本切片。 Ellipsis 和 newaxis 对象也可以穿插其中。
NumPy 切片创建一个视图,而不是像字符串、元组和列表等内置 Python 序列的情况下的副本。
在选择对象,obj是a的时候触发高级索引 非元组序列对象,一个 ndarray(数据类型为整数或布尔值), 或具有至少一个序列对象或 ndarray 的元组(数据类型 整数或布尔值)。有两种类型的高级索引:整数 和布尔值。
高级索引始终返回数据的副本(与 返回视图的基本切片)。
如果向索引提供一个元组,则该元组将被解释为索引列表。
z = np.arange(81).reshape(3,3,3,3)
>>> indices = (1,1,1,1)
>>> z[indices]
40
如果 ndarray 对象是结构化数组,则可以通过使用字符串索引数组来访问数组的字段,类似于字典。索引 x['field-name'] 将新视图返回到数组
注意
【问题讨论】:
-
@ hpaulj 是的,你是对的,它创建了一个视图,它仅作为“高级”用于奇怪的结果形状规则。我记得我遇到了那个怪癖,但很明显,这一切都够令人困惑的了。
-
当切片夹在列表之间时会发生令人困惑的情况。然后切片维度移动到末尾。子案例的形式为(标量、切片、列表)。
-
对于心智模型,需要很好地理解这些 numpy ndarray 属性:缓冲区、偏移量、步幅和形状。然后更容易理解为什么基本切片总是能够返回一个视图(使用相同的缓冲区)。还有为什么有些操作一般不能返回一个视图并且总是返回一个副本。