NumPy配列のsize、shape、shape[i]等の日本語表現は様々です。例えば、.shape[i]が示す値は「要素数」「大きさ」「長さ」など多くの言葉が定義されています。そこで、これらの中から使いやすく混乱しにくい表現を選び、紹介したいと思います。
なお、日本語表現は以下の①~③を考慮し、最も適当であると考えられる表現を選びました。
①混乱しにくい表現。②マイナーすぎない表現。③長すぎない表現。
0.Python♪ モヤモヤを解消する明快な用語集
「Python♪モヤモヤを解消する明快な用語集」の用語集Top(索引)はこちらです。
モヤモヤを解消する明快な用語集を目指します。例えば言葉の定義が「グレー」なものは「グレー」であると解説します。なお、同じ言葉でも、例えば「Python」と「Java」では定義が違うことがあります。 その場合、「python」での定義を解説します。
1.解説する用語
① i番目の次元、
※2次元配列の場合は行、列
② i番目の次元の長さ (x.shape[i])
※2次元配列の場合は行数、列数
③ i軸 (axis = i)
④ 次元数 (x.ndim)
⑤ 形状(各次元の長さ) (x.shape)
⑥ 全要素数 (x.size)
2.用語の定義の図示
まず、一目でわかるように用語の定義を図示したいと思います。なお、①「 i番目の次元」②「 i番目の次元の長さ」については、必要に応じて、① 「0から始まるi番目の次元」② 「0から始まるi番目の次元の長さ」と表記し、iがインデックスであることを明記したほうがよいと思います。
なお、2次元配列の場合には、①「0番目の次元」→「行」、「1番目の次元」→「列」とし、②「0番目の次元の長さ」→「行数」、「1番目の次元の長さ」→「列数」とします。
以下、上記3次元配列のときのサンプルコードです。
#コード01
import numpy as np
x = np.arange(24)
x = x.reshape((2, 3, 4))
print(x)
print('x.ndim =', x.ndim)
print('x.shape =', x.shape)
print('x.shape[0] =', x.shape[0])
print('x.shape[1] =', x.shape[1])
print('x.shape[2] =', x.shape[2])
print('x.size =', x.size)
print('x[0].size =', x[0].size)
print('x[0, 0].size =', x[0, 0].size)
print('x[0, 0, 0].size =', x[0, 0, 0].size)
print('len(x) =', len(x))
print('len(x[0]) =', len(x[0]))
print('len(x[0, 0]) =', len(x[0, 0]))
#出力01
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
x.ndim = 3
x.shape = (2, 3, 4)
x.shape[0] = 2
x.shape[1] = 3
x.shape[2] = 4
x.size = 24
x[0].size = 12
x[0, 0].size = 4
x[0, 0, 0].size = 1
len(x) = 2
len(x[0]) = 3
len(x[0, 0]) = 4
3.各用語の説明
それでは、「i番目の次元」「i番目の次元の長さ」「i軸」「次元数」「全要素数」について説明します。
なお、O'REILLYの「入門 Python3」(2017.10.3, 初版第7刷)では、ndim→「階数」、size→「配列内の値の総数」、shape→「各階の値の数」と説明されていますが、線形代数における階数(ランク)はNumPyではmatrix_rankで求めますので、ndim→「階数」の表現は誤りだと思います。
#コード02
import numpy as np
x = np.array([[[0,1],[0,0]]])
print('ndim =',b.ndim)
print('np.linalg.matrix_rank =',np.linalg.matrix_rank(x))
#出力02
ndim = 3
np.linalg.matrix_rank = [1]
(1) i番目の次元
例えばx[2, 3, 1]は3次元配列であり、[ ]の中の数字は左から順番に「0番目の次元」「1番目の次元」「2番目の次元」のインデックスを示します。
ここで、混乱しやすいのは「i番目の次元」のiの部分がPythonでは0から始まる数字であることです。
「1番目の次元」とだけ聞くと一番左の次元と勘違いしてしまう可能性がありますので、必要に応じて「0から始まる1番目の次元」といった表現で明示した方がよいと思います。
axisの指定も0からはじまっており、Pythonでは一番左の次元を「1番目の次元」と表現すると混乱します。
(2) i番目の次元の長さ
「i番目の次元の長さ」とはi番目の次元が取り得るインデックスの総数のことです。実は「i番目の次元の長さ」よりも「i番目の次元の要素数」「i番目の次元の大きさ」と表現されることが多いのですが、「長さ」という表現をお勧めします。
私が「i番目の次元の要素数」や「i番目の次元の大きさ」を選ばなかったのは、「要素数」と混同しやすいことです。
「要素数」「大きさ」といった表現は各次元が取り得る範囲というだけではなく、要素の数という意味で使われることがあるため、混同しやすい用語です。
また、出力03のようにi番目の次元が取り得るインデックスの総数はsize(大きさ)ではなく、len(長さ)で求められることから「長さ」という表現が関数名とも合っていると考えられます。
なお、「次元の長さ」という表現はMATLABなどで主に使われている表現です。
#コード03
import numpy as np
x = np.arange(24)
x = x.reshape((2, 3, 4))
print(x)
print('x.size =', x.size)
print('x[0].size =', x[0].size)
print('x[0, 0].size =', x[0, 0].size)
print('x[0, 0, 0].size =', x[0, 0, 0].size)
print('len(x) =', len(x))
print('len(x[0]) =', len(x[0]))
print('len(x[0, 0]) =', len(x[0, 0]))
#出力03
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
x.size = 24
x[0].size = 12
x[0, 0].size = 4
x[0, 0, 0].size = 1
len(x) = 2
len(x[0]) = 3
len(x[0, 0]) = 4
なお、「i番目の次元の長さ」は.shape[i]で求められます。
#コード04
import numpy as np
x = np.arange(24)
x = x.reshape((2, 3, 4))
print(x)
print('x.shape =', x.shape)
print('x.shape[0] =', x.shape[0])
print('x.shape[1] =', x.shape[1])
print('x.shape[2] =', x.shape[2])
#出力04
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
x.shape = (2, 3, 4)
x.shape[0] = 2
x.shape[1] = 3
x.shape[2] = 4
(3) i軸(axis = i)
NumPyの関数sumやmaxなどで何番目の次元を計算の対象にするのかを選択するときにaxisを用います。
選択する次元の方向を0軸、1軸、2軸・・・と呼びます。
(4) 次元数
「次元数」は、言葉の通り配列が何次元の配列であるかを示します。ndimによって求めます。
#コード05
import numpy as np
x = np.arange(24)
x = x.reshape((2, 3, 4))
print('x.ndim =', x.ndim)
#出力05
x.ndim = 3
(5) 形状(各次元の長さ)
配列の「形状」とは、「各次元の長さ」をタプルで表現したものです。shapeで求めます。
#コード06
import numpy as np
x = np.arange(24)
x = x.reshape((2, 3, 4))
print(x)
print('x.shape =', x.shape)
print('x.shape[0] =', x.shape[0])
print('x.shape[1] =', x.shape[1])
print('x.shape[2] =', x.shape[2])
#出力06
x.shape = (2, 3, 4)
x.shape[0] = 2
x.shape[1] = 3
x.shape[2] = 4
(6) 全要素数
「全要素数」とは言葉の通りNumPy配列の全ての要素の数です。「配列の大きさ」とも言います。「全要素数」の方が直接表現で明快です。sizeによって求めることができます。
#コード07
import numpy as np
x = np.arange(24)
x = x.reshape((2, 3, 4))
print(x)
print('x.size =', x.size)
#出力07
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
x.size = 24
私が実際に購入した教材のご紹介
以下、私が実際に購入したPythonの教材をまとめてみました。 Pythonを学習する上で、少しでもお役に立つことができればうれしいです。
・Python♪私が購入したPythonの書籍のレビュー
・UdemyのPythonの動画講座を書籍を買う感覚で購入してみた
その他
液晶ペンタブレットを買いました
(1) モバイルディスプレイを買うつもりだったのに激安ペンタブレット購入
以下、私が光回線を導入した時の記事一覧です。
(1) 2020年「光回線は値段で選ぶ」では後悔する ←宅内工事の状況も説明しています。
(2) NURO光の開通までWiFiルーターを格安レンタルできる
(3) NURO光の屋外工事の状況をご紹介。その日に開通!
(4) 光回線開通!実測するとNURO光はやっぱり速かった
(5) ネット上のNURO光紹介特典は個人情報がもれないの?