【发布时间】:2018-11-02 17:07:42
【问题描述】:
我以前看过一两次,但我似乎找不到任何官方文档:Using python range objects as indices in numpy。
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 和它的文档之间的细微差异并非完全闻所未闻,也不一定表明某个功能不是有意的(参见例如 here)。
那么,有没有人知道为什么会这样?如果它是一个预期的功能,那么确切的语义是什么/它有什么用?是否有任何 ND 概括?
【问题讨论】:
-
我从没见过这个;它被用于任何有信誉的图书馆吗?
-
numpy 早于 Python 3。在 Python 2 中,
range(3)是一个整数列表,numpy 将其视为“类数组”。如果 numpy 没有在 Python 3 中以向后兼容的方式处理它,那将是一团糟。 -
“那么,有没有人知道为什么会这样?” 这是一个不错的功能,非正式地称为“花式”索引,在文档中称为 @987654322 @.
-
@WarrenWeckesser 没错,上面写着
(...) a non-tuple sequence object(虽然non-tuple sequence (such as a list) containing slice objects似乎会触发基本索引)。不知道如果IndexError没有被提出,为什么它应该挂起,但无论如何。我认为您可以将其作为答案。 -
可能是索引尝试将
np.asarray(x)与range(3)和[0,1,2]一起使用。其他事情会产生错误或对象 dtype 数组。 @WarrenWeckesser,很好地说明了与 Py2 的range版本的兼容性。
标签: python numpy array-indexing