我以前看过一两次,但我似乎找不到任何官方文档:range在 numpy 中使用 python对象作为索引。import numpy as npa = 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 概括?
2 回答

喵喵时光机
TA贡献1846条经验 获得超7个赞
总结一下(感谢评论中的@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
添加回答
举报
0/150
提交
取消