为什么Python 3 itertools.chain不让我实现多范围

时间:2019-12-24 21:04:52

标签: python-3.x numpy itertools

我正在尝试使用a = np.array( range( 37 ) ) print("a", a, file = sys.stderr) c = chain(range(0,13), range(23,29 ) ) print( "list(c)", list(c), file = sys.stderr ) 来实现 multirange 的概念,类似于串联的多个范围:

c

到目前为止,太好了。接下来,我想使用a[ range(2,8) ] => array( [2, 3, 4, 5, 6, 7 ] ) 作为复合数组索引,类似于我可以说的

x = a[ c ]
print( "x", x, file = sys.stderr )

所以,去了:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-8-192fff14b87d> in <module>
      3 c = chain(range(0,13), range(23,29 ) )
      4 print( "list(c)", list(c), file = sys.stderr )
----> 5 x = a[c]
      6 print( "x", x, file = sys.stderr )

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

但是...

list(c)

很显然,这是另一个Python索引之谜。有人可以告诉我我在做什么错,并帮助我弄清楚如何获得我的意图(“多范围”)。我知道我可以只使用#进行索引,但是我认为这无济于事,也就是说,延迟枚举隐含的索引集。

1 个答案:

答案 0 :(得分:0)

如错误所述,仅有效索引为integersslicesellipsis 这里c<class 'itertools.chain'>

的实例

您可以代替的是将其转换为列表,然后使用它。

>>> c = chain(range(0,13), range(23,29 ) )
>>> a[list(c)]
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 23, 24, 25, 26,
       27, 28])