Numpy を使います。
Online Editorを使えば自分の環境を汚さずに使えます。
要素単体で範囲外を参照
要素単体で範囲外を参照してみます。
random.randで適当なfloat行列を作れるのでテスト時に重宝しますね。
import numpy as np
A = np.random.rand(5,5)
B = A[-6,-6]
print(A)
print(B)
結果は当然エラーです。
IndexError: index -6 is out of bounds for axis 0 with size 5
きちんと範囲外であることを教えてくれます。
範囲外を含むCropを行った場合
切り抜きの作法 VS matlab
Numpyの切り抜きはMatlab使いとしては不思議な書き方で,以下のように書きます。
スタートする行と列,それに切り抜きのサイズを加えたものを書きます。
A[row:row+h,col:col+wid]
なお,MATLABだと以下のようになります。
A(row:row+h-1,col:col+wid-1)
一見くどいですが,これはCropの始まる列と終わる列を書くので直感的にわかりやすい(と思っています)。
切り抜きのエラーは空Arrayを返す。
本題にうつると以下のように範囲外の部分を含む行列を書くとEmpty Arrayを返します。
import numpy as np
A = np.random.rand(5,5)
B = A[3:3,3:3]
print(A)
print(B)
print(B.size)
なお,空のArrayはsizeが0であることで見抜けます。MATLABみたいにisempty的なのがあればよかったのに(要調査)。
Debugのときに役立ててください。
[[ 0.69854315 0.83308108 0.66557232 0.27758132 0.39308571 0.70643012]
[ 0.54305722 0.39600401 0.40206199 0.79224479 0.66720215 0.25355632]
[ 0.35509515 0.37872672 0.24820214 0.08225086 0.03877466 0.42718548]
[ 0.33554461 0.59891833 0.11223246 0.33976823 0.53329896 0.90859096]
[ 0.56158341 0.48374031 0.1829933 0.12855241 0.82018729 0.42246654]
[ 0.80543369 0.00844302 0.4601397 0.15118067 0.24652464 0.76726793]]
[]
0
二次元の切り抜き失敗例
切り抜き失敗してもサイズが保存されることが有ります。
A = np.random.rand(5,5)
print(A)
B=A[1:6,1:4]
print(B)
print(B.shape)
C=A[-1:3,1:4]
print(C)
print(C.shape)
上のコードを試すとわかります。(エディタが糞重くなったので中断)