【问题标题】:List and tuple behave differently列表和元组的行为不同
【发布时间】:2013-08-13 09:58:15
【问题描述】:

我很清楚 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 中还出现在哪里?

【问题讨论】:

    标签: python arrays numpy scipy


    【解决方案1】:

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

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

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

    还记得,来自documentation

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

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

    此外,来自相同的文档

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-19
      • 1970-01-01
      • 2019-03-19
      相关资源
      最近更新 更多