Help us understand the problem. What is going on with this article?

numpyの1次元配列のshapeがややこしかった

More than 1 year has passed since last update.

概要

numpy初心者向けの記事です。Pythonを使い始めて間もない頃、1行列のshapeの出力について勘違いしてました。割と引っかかりやすいんじゃないかなと思い、実例をもとに共有いたします。

まず以下のarrayのshapeを見てみる。

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)

出力は以下のようになります。

(2, 3)

左側に行列の行、右側に列が表示される。数学的にも2行3列と表現されるので納得。

\begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix}

行を一つ減らして、再びshapeを出力してみる。

b = np.array([1, 2, 3])
print(b.shape)

出力は以下。

(3, )

...? 1行3列で、(1, 3) が出力されると思ったけど違った。。

以下のように行列積を計算してみる

a = np.array([2, 2])
b = np.array([[1, 2], [3, 4]])
print(np.dot(a, b))
print(np.dot(b, a))

すると、結果は

[ 8 12]
[ 6 14]

行列積の計算の際は、もう一つの行列の shape に応じて、柔軟に行ベクトル、列ベクトルとして計算してくれることがわかる。

まとめ

一次元配列のshapeは要素が1個のタプルになり、(要素数, )として表現される。数学的には1つの行のみを持つ行列を行ベクトル、1つの列のみを持つ行列を列ベクトルと呼ぶが、ndarrayの一次元配列では行ベクトルと列ベクトルの区別はない。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away