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
.