我很清楚there are differences between lists and tuples和tuples 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中?
答案 0 :(得分:4)
您正在获得不同的行为,因为在numpy中,支持三种类型的索引
使用元组进行索引只相当于一个参数列表,后缀为基本切片,其中使用非元组列表导致高级索引。
还要记住,来自documentation
当选择对象obj为a时,将触发高级索引 非元组序列对象,ndarray(数据类型为integer或bool), 或者具有至少一个序列对象或ndarray(数据类型的元组)的元组 整数或布尔)。高级索引有两种类型:整数 和布尔。
高级索引始终返回数据的副本(与。对比) 返回视图的基本切片。)
此外,来自相同的文档
在Python中,x [(exp1,exp2,...,expN)]相当于x [exp1,exp2, ......,expN];后者只是前者的语法糖。