Python具有内置功能,可用于检查整个切片的有效性:slice.indices
。个别指数内置了类似的内容吗?
具体来说,我有一个索引,比如a = -2
,我希望对4元素列表进行规范化。是否有一种方法等同于已经内置的以下方法?
def check_index(index, length):
if index < 0:
index += length
if index < 0 or index >= length:
raise IndexError(...)
我的最终结果是能够构造一个具有单个非None
元素的元组。我目前正在使用list.__getitem__
为我做检查,但它似乎有点尴尬/矫枉过正:
items = [None] * 4
items[a] = 'item'
items = tuple(items)
我希望能够做到
a = check_index(a, 4)
items = tuple('item' if i == a else None for i in range(4))
这个例子中的所有内容都很容易协商。唯一能解决的问题是我得到a
的方式可以包含任意索引可能存在的所有问题,最终结果必须是tuple
。
如果解决方案使用numpy并且仅真正应用于numpy数组而不是Python序列,我会非常高兴。任何一个都适合我想到的应用程序。
答案 0 :(得分:2)
如果我理解正确,您可以在示例range(length)[index]
中使用range(4)[-2]
。这可以正确处理负数和越界指数。至少在Python的最新版本中,range()
并没有真正创建一个完整的列表,所以即使对于大型参数,这也会有不错的表现。
如果您有大量索引并行执行此操作,那么可能在使用Numpy矢量化算法进行计算时可以获得更好的性能,但我不认为该技术有{ {1}}将适用于该案例。您必须使用问题中的实现手动执行计算。
答案 1 :(得分:2)
有一个名为numpy.core.multiarray.normalize_axis_index
的函数可以完全满足我的需要。它特别有用,因为我想到的实现是numpy
数组索引:
from numpy.core.multiarray import normalize_axis_index
>>> normalize_axis_index(3, 4)
3
>>> normalize_axis_index(-3, 4)
1
>>> normalize_axis_index(-5, 4)
...
numpy.core._internal.AxisError: axis -5 is out of bounds for array of dimension 4