She*_*hep 6 python arrays numpy scipy
我很清楚地知道,有列表和元组之间的差异和元组不只是不断名单,但有其中两个实际上是由区别对待的几个例子的代码(由编码约定反对),所以我(草率地)可以互换地使用它们.
然后我遇到了一个案例,他们给出了完全不同的行为:
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
Run Code Online (Sandbox Code Playgroud)
谁能解释这里发生了什么?更重要的是,这个陷阱还有什么地方出现在scipy中?
您会得到不同的行为,因为在 numpy 中,支持三种类型的索引
使用元组进行索引相当于参数列表,其后缀为基本切片,而使用非元组列表会导致高级索引。
还请记住,从文档中
当选择对象 obj 是非元组序列对象、ndarray(数据类型为整型或布尔型)或至少具有一个序列对象或 ndarray(数据类型为整型或布尔型)的元组时,会触发高级索引。高级索引有两种类型:整数和布尔。
高级索引始终返回数据的副本(与返回视图的基本切片相反)。
而且,来自相同的文档
在 Python 中,x[(exp1, exp2, ..., expN)] 相当于 x[exp1, exp2, ..., expN];后者只是前者的语法糖。