Numpy ベクトルと行列 [0,0,0] ≠ [[0,0,0]]
超超超初歩的な勘違いの整理.
import numpy as np x = np.array([1,2,3]) x.shape # (3,) x # array([1, 2, 3]) y = np.array([[1,2,3]]) y # array([[1, 2, 3]]) y.shape # (1, 3)
これまで,x = np.array([1,2,3])→x.shapeで(1, 3)の形状が生まれるものと勘違いしていた.
そのためx.shapeで得られた(3,)などの表記を見るたび,『なぜ1行3列の形状を与えた(誤り)のに行方向しか持たないのか』と不思議に思っていた.
原因
そもそもx = np.array([1,2,3])で与えている[1,2,3]は,一次元であって1行3列の行列ではなかった.
つまり,行ベクトルや列ベクトルはあれど,ベクトルは行と列の要素を同時に持たない(持った時点でそれは行列な)わけで,ベクトルにshapeを行って(n,m)(n行m列)という形状を期待していたことがそもそも誤りだった.
恐らく,ベクトルに対するshapeが(n, )という行列的に表記されるが故に起きたと推察.
単に戻り値はベクトルも行列もタプルで統一されていて,1次元(ベクトル)なら1つの値を持つタプル,2次元なら2つ値を持つタプル…というだけの話だった.
今後は,(n,)はn個の要素を持つただのベクトルという認識で….
解決策?
x.shapeで(1,3)の形状を得るためには,x = np.array([[1,2,3]])という風に,[]を二重にする必要がある.