列表和元组表现不同

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中?

Abh*_*jit 4

您会得到不同的行为,因为在 numpy 中,支持三种类型的索引

  • 基本切片
  • 高级索引
  • 记录访问

使用元组进行索引相当于参数列表,其后缀为基本切片,而使用非元组列表会导致高级索引。

还请记住,从文档中

当选择对象 obj 是非元组序列对象、ndarray(数据类型为整型或布尔型)或至少具有一个序列对象或 ndarray(数据类型为整型或布尔型)的元组时,会触发高级索引。高级索引有两种类型:整数和布尔。

高级索引始终返回数据的副本(与返回视图的基本切片相反)。

而且,来自相同的文档

在 Python 中,x[(exp1, exp2, ..., expN)] 相当于 x[exp1, exp2, ..., expN];后者只是前者的语法糖。