6

我很清楚列表和元组之间存在差异,并且元不仅仅是常量列表,但是很少有例子表明代码实际上对两者进行了不同的处理而不是通过编码约定),所以我(草率地)交替使用它们。

然后我遇到了一个案例,他们给出了完全不同的行为:

>>> 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]])

有人可以解释这里发生了什么吗?更重要的是,这个陷阱在 scipy 中还出现在哪里?

4

1 回答 1

4

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

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

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

还要记住,从文档

Advanced indexing is triggered when the selection object, obj, is a non-tuple sequence object, an ndarray (of data type integer or bool), or a tuple with at least one sequence object or ndarray (of data type integer or bool). 高级索引有两种类型:整数和布尔。

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

此外,来自相同的文档

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

于 2013-08-12T07:16:28.700 回答