【问题标题】:Confusion with Fancy indexing (for non-fancy people)与花式索引混淆(对于非花式的人)
【发布时间】:2017-01-08 04:58:15
【问题描述】:

假设一个多维数组

import numpy as np
foo = np.random.rand(102,43,35,51)

我知道最后这些维度代表一个二维空间 (35,51) 假设我想要第 0 列的第 8 到 30 行 根据我对索引的理解,我应该调用

foo[0][0][8::30][0]

虽然知道我的数据(与此处使用的随机数据不同),但这不是我所期望的

我可以试试这个确实有效,但看起来很荒谬

foo[0][0][[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],0]

现在我可以在this documentation 中找到我也可以使用 类似:

foo[0][0][[8,30],0]

它只给了我第 8 行和第 30 行的值 而这:

foo[0][0][[8::30],0]

报错

File "<ipython-input-568-cc49fe1424d1>", line 1
foo[0][0][[8::30],0]
                ^
SyntaxError: invalid syntax

我不明白为什么 :: 参数不能在这里传递。那么在索引语法中指示范围的方法是什么?

所以我想我的总体问题是什么是这种语法的正确 pythonic 等价物:

foo[0][0][[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],0]

【问题讨论】:

  • 不清楚你想用foo[0][0][[8::30],0] 完成什么。 foo[0][0][8::30][0] 怎么样?
  • 你试过foo[0, 0, 8:30, 0]吗?
  • 还要注意:: 是扩展切片语法的一部分,无需一直称其为“花式索引”。 :)stackoverflow.com/questions/509211/…
  • @OphirCarmi 这确实有效!
  • @MattBall 试过 foo[0][0][8::30][0] 但我得到的似乎不是我所期望的。从我的数据集的值来看,结果似乎是一个行切片

标签: arrays python-2.7 numpy indexing slice


【解决方案1】:

代替

foo[0][0][8::30][0]

试试

foo[0, 0, 8:30, 0]

foo[0][0] 部分与foo[0, 0, :, :] 相同,选择二维数组 (35 x 51)。但是foo[0][0][8::30] 选择了这些行的子集

考虑在二维数组上使用 0::30 时会发生什么:

In [490]: np.zeros((35,51))[0::30].shape
Out[490]: (2, 51)

In [491]: np.arange(35)[0::30]
Out[491]: array([ 0, 30])

30step,而不是切片的 stop 值。

最后一个 [0] 然后选择这些行中的第一行。最终结果与foo[0,0,0,:]相同。

在大多数情况下,使用逗号语法索引多个维度会更好。如果您希望前 30 行使用 0:30,而不是 0::30(这是基本的切片符号,适用于列表和数组)。

至于:

foo[0][0][[8::30],0]

将其简化为x[[8::30], 0]。 Python 解释器接受[1:2:3, 0],将其转换为tuple(slice(1,2,3), 0) 并将其传递给__getitem__ 方法。但是冒号语法在非常特定的上下文中被接受。解释器将那组内括号视为一个列表,并且不接受冒号。

foo[0,0,[1,2,3],0]

没关系,因为内括号是一个列表,numpy getitem 可以处理这些。

numpy 有一个将切片符号转换为数字列表的工具。如果它仍然令人困惑,请使用它:

In [495]: np.r_[8:30]
Out[495]: 
array([ 8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
       25, 26, 27, 28, 29])
In [496]: np.r_[8::30]
Out[496]: array([0])
In [497]: np.r_[8:30:2]
Out[497]: array([ 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])

【讨论】:

  • 感谢详细的解释!确实有助于理解这一点,尤其是 np.r_ 函数
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2021-10-24
  • 2012-03-14
相关资源
最近更新 更多