Listas / matrizes do Python: desabilita a quebra automática de indexação negativa em fatias

Enquanto eu encontro o número negativo envolvido (isto é,A[-2] indexando o penúltimo elemento) extremamente útil em muitos casos, quando acontece dentro de uma fatia, geralmente é mais um aborrecimento do que um recurso útil, e muitas vezes desejo uma maneira de desabilitar esse comportamento específico.

Aqui está um exemplo 2D enlatado abaixo, mas eu tive a mesma coisa algumas vezes com outras estruturas de dados e em outros números de dimensões.

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()

Na fatia acima, eu preferiria que qualquer número negativo na fatia fosse tratado da mesma forma queNone é, em vez de embrulhar para o outro lado da matriz.

Por causa do encapsulamento, a implementação de outra forma legal acima fornece resultados incorretos em condições de contorno e requer algum tipo de patch como:

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()

Eu também tentei preencher zero a matriz ou lista, mas ainda é deselegante (requer ajustar os índices de locais de pesquisa de acordo) e ineficiente (requer a cópia da matriz).

Estou faltando algum truque padrão ou solução elegante para cortar assim? Notei que python e numpy já lidam com o caso em que você especifica um número grande demais - ou seja, se o índice for maior que a forma do array, ele se comporta da mesma forma como se fosseNone.

questionAnswers(4)

yourAnswerToTheQuestion