Help us understand the problem. What is going on with this article?

Numpyで行列の範囲外を切り抜くとどうなるか

More than 1 year has passed since last update.

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)

上のコードを試すとわかります。(エディタが糞重くなったので中断)

ossyaritoori
電機・ロボット・制御・画像その他
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away