【问题标题】:What is the meaning of "a[:,1]" in python slicingpython切片中的“a[:,1]”是什么意思
【发布时间】:2020-12-12 02:18:11
【问题描述】:

我正在阅读有关 python 切片的信息,但我无法弄清楚这一点。

clf.predict_proba(X_test)[:,1]

然后我尝试用简单的列表来测试自己。

a = [2,4,6,7,7,8]

>>> a[:,1]
-----> TypeError: list indices must be integers or slices, not tuple

【问题讨论】:

标签: python python-3.x numpy


【解决方案1】:

喂! @martin a[:,1:] 例如用于对二维 NumPy 数组进行切片。

a = [[1,2,3,4,5], [6,5,3,2,6]]

表示为

a = [[1, [ 6,
      2,   5,
      3,   3,
      4,   2,
      5    6
      ],     ]] 

a[:,1] == a[col[start] : col[end], row[start] : row[end]]

将是[[2,5]] 表示在第一个索引处同时获取列和行。

【讨论】:

  • 小心@martian_rover !您使用的定义不是 numpy 数组,而是嵌套列表。使用您在示例中提供的切片将返回 IndexError
【解决方案2】:

使用 numpy 数组时有很大的不同,clf.predict_proba(X_test)[:,1]list 的结果是:

正如在 cmets 中提到的,列表可以用单个值切片,而不是因为它们的结构而用逗号分隔,而一个可能是 n 维的 numpy 数组可以用逗号分隔的值切片以表示行数和列数,就像pd.DataFrame.iloc[] 一样。

np.array([1,1],[2,3],[4,3])

ex_list = [[1,1],[2,3],[4,3]]

但这实际上是什么样子的呢?在列表的情况下,它们是一维的或flat,而这个数组不是。

1 arr_example 有 3 行 2 列:

array([[1, 1],
       [2, 3],
       [4, 3]])  

2ex_list:

[[1,1],[2,3],[4,3]]

如果你想访问嵌套列表的内部值,那么索引必须在第一个切片器之外完成,如下例所示:

arr_example[:1,0] # arr_example[rows,columns]
list_example[:1][0][0]

arr_example 的这种情况下,我们选择从开始到的行,但不包括 1(位置 1,因此只有第一行)和第一列(位置 0)。查看数据的结构并了解切片的工作原理,以下输出是有意义的:

array([1])
1

【讨论】:

  • 所以你是说如果我理解你的话,numpy 数组 n 维切片和 pandas 数据帧切片使用 loc 和 iloc 以相同的方式完成 [:,1]
  • 以你的方式,第一个值表示行数,第二个值表示列数,是的。我添加了一个完整的解释。
【解决方案3】:

x[:,1]被解释器翻译成

x.__getitem__((slice(None), 1))

也就是说,它调用x 对象的__getitem__ 方法,向它(在这种情况下)传递一个元组参数。 : 被转换为 slice 对象。创建元组的是索引中的逗号。

如果 x 是一个 numpy 数组,则使用元组进行索引是有意义的(取决于它自己的规则)。但正如您的错误所示,使用 tuple 进行索引不适用于列表。错误说明了什么是允许的。

因此,虽然 python 语法通常允许这种索引,但细节取决于类。

对于二维数组,[:,1] 表示选择第二列。

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 2020-02-15
    • 1970-01-01
    • 2018-08-06
    • 2015-10-16
    • 2021-12-24
    • 1970-01-01
    • 2014-02-09
    • 2011-01-26
    相关资源
    最近更新 更多