BETA

配列のストライドのお勉強

投稿日:2019-09-29
最終更新:2019-09-29

導入

環境はPython3.7.4, Numpy1.17.0です。

import numpy as np  

a = np.arange(24).reshape(2, 3, 4)  
print(a)  
# [[[ 0  1  2  3]  
#   [ 4  5  6  7]  
#   [ 8  9 10 11]]  
#  
#  [[12 13 14 15]  
#   [16 17 18 19]  
#   [20 21 22 23]]]  

print(a.shape)  
# (2, 3, 4)  

print(a.strides)  
# (96, 32, 8)  

配列の全要素数は24しかないはずなのに、各ストライドが(96, 32, 8)って何が起きたんですかね???

ストライドの復習

例として、1次元配列(np.arange(24))で考えてみます。


とするとnp.arange(24)reshape(2, 3, 4)

これをxyz平面上にもってくるとさらにわかりやすいです。

1次元配列において、要素0を基準としたとき、x方向は1要素後にあります。y方向は4要素後、z方向は12要素後です。
したがって、この配列はstrides = (12, 4, 1)となります。

なぜ全要素数よりもストライドが大きかったのか

Tuple of bytes to step in each dimension when traversing an array.
numpy.ndarray.strides NumPy v1.17 Manual

Numpyのドキュメントによると各ストライドはByteでの値らしいです。

a = np.arange(24).reshape(2, 3, 4)  
print(a.dtype)  
# int64  

int6464bit1byte = 8bitより8byte = 64bit
よって(12, 4, 1) × 8 = (96, 32, 8)となります。やったね。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

A03kiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう