虽然我发现负数环绕(即A[-2]
索引倒数第二个元素)在许多情况下非常有用,但当它发生在切片内时,它通常比一个有用的功能更令人烦恼,我经常希望有一种方法禁用该特定行为.
这是下面的一个罐装2D示例,但我与其他数据结构和其他维度的数量相同.
import numpy as np
A = np.random.randint(0, 2, (5, 10))
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
在上面的切片中,我宁愿切片的任何负数都将被视为相同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()
Run Code Online (Sandbox Code Playgroud)
我还尝试对数组或列表进行零填充,但它仍然不够优雅(需要相应地调整查找位置索引)并且效率低(需要复制数组).
我错过了一些像这样切片的标准技巧或优雅解决方案吗?我注意到python和numpy已经处理了一个很好地指定太大数字的情况 - 也就是说,如果索引大于数组的形状,它的行为就像它一样None
.