列表和元组表现不同

时间:2013-08-12 06:52:49

标签: python arrays numpy scipy

我很清楚there are differences between lists and tuplestuples aren't just constant lists,但很少有例子可以通过代码来对待这两个实际情况(而不是编码惯例),所以我(草率地)可以互换地使用它们。

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

还要记住,来自documentation

  

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

     

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

此外,来自相同的文档

  

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