チラ裏備忘録

情報整理

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]])という風に,[]を二重にする必要がある.