使用 python 范围对象索引到 numpy 数组

我以前看过一两次,但我似乎找不到任何官方文档:range在 numpy 中使用 python对象作为索引。


import numpy as np

a = np.arange(9).reshape(3,3)

a[range(3), range(2,-1,-1)]

# array([2, 4, 6])

让我们触发一个索引错误,以确认范围不在合法索引方法的官方范围内(双关语):


a['x']


# Traceback (most recent call last):

#   File "<stdin>", line 1, in <module>

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

现在,numpy 与其文档之间的细微差异并非完全闻所未闻,也不一定表明该功能不是有意为之(参见此处的示例)。


那么,有没有人知道这为什么有效?如果它是一个预期的功能,它的确切语义是什么/它有什么好处?是否有任何 ND 概括?



侃侃尔雅
浏览 165回答 2
2回答

喵喵时光机

总结一下(感谢评论中的@WarrenWeckesser):这种行为实际上已记录在案。人们只需要意识到range对象是严格意义上的Python 序列。所以这只是花哨的索引的一个例子。但是请注意,它非常慢:>>> a = np.arange(100000)>>> timeit(lambda: a[range(100000)], number=1000)12.969507368048653>>> timeit(lambda: a[list(range(100000))], number=1000)7.990526253008284>>> timeit(lambda: a[np.arange(100000)], number=1000)0.22483703796751797
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python