多くの場合、負の数のラップアラウンド (つまりA[-2]
、最後から 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
ます。