虽然我发现负数环绕(即A[-2]
索引倒数第二个元素)在许多情况下非常有用,但当它发生在切片内时,它通常更令人烦恼而不是有用的功能,我经常希望有一种方法来禁用该特定行为。
下面是一个罐装的 2D 示例,但我对其他数据结构和其他数量的维度也有过几次同样的烦恼。
import numpy as np
A = np.random.randint(0, 2, (5, 10))
def foo(i, j, r=2):
'''sum of neighbours within r steps of A[i,j]'''
return A[i-r:i+r+1, j-r:j+r+1].sum()
在上面的切片中,我希望切片的任何负数都被视为相同None
,而不是包装到数组的另一端。
由于包装,上面其他很好的实现在边界条件下给出了不正确的结果,并且需要某种补丁,例如:
def ugly_foo(i, j, r=2):
def thing(n):
return None if n < 0 else n
return A[thing(i-r):i+r+1, thing(j-r):j+r+1].sum()
我也尝试过对数组或列表进行零填充,但它仍然不优雅(需要相应地调整查找位置索引)并且效率低下(需要复制数组)。
我是否缺少一些标准技巧或优雅的解决方案来进行这样的切片?我注意到 python 和 numpy 已经很好地处理了您指定太大数字的情况 - 也就是说,如果索引大于数组的形状,它的行为与None
.