1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-11

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)

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?