moGue’s Garten

わりとアレな知識をアレな人向けになりふり構わず放出する

忘れがちな numpy

python で行列演算を行う上で numpy は欠かせない. しかし,numpy.ndarray は行列というよりあくまで配列なので, MATLAB などを使っていた人にとっては奇妙と思える動作をすることがある.

  1. index が 0 から始まる
  2. 1行のみ取り出すと自動的に次元が減る
  3. numpy.ndarray 同士の積や商が elementwise な積や商になる

1. や 3. については,プログラミング言語の配列をイメージすればそこまで不自然なことではない. むしろ,慣れてくれば MATLAB の仕様よりも便利かもしれない. なお,numpy で行列積を計算したければ,@ 演算子を用いるのが便利である.

import numpy as np

A = np.array([[1, 2], [3, 4], [5, 6]])
B = np.array([[2, 3], [4, 5]])

print(A @ B)
  1. についてはどうしてこういう仕様になったのか知らないが,たとえば
A[:,1]

とすると

array([2, 4, 6])

が返ってくる.この shape は (3,) である*1. 本来は(1,3)の形をした縦ベクトルを取り出したいにもかかわらず, (3,)という1次元の配列が返ってきている. なおこの事象は横ベクトルを取り出すときにも同様に起きる.(3,1)を期待しても(3,)の配列が返ってくる.

これを回避したい,すなわち縦ベクトルは縦ベクトルで取り出したい,というときには,大別して2つのやり方がある.

  1. numpy.newaxis または None を使って次元を追加する
  2. スライスを用いる
A[:, np.newaxis, 1]
A[:, [1]]

どちらでも(1,3)の配列が取り出せる.お好みでよさそう.

*1:tuple であることを示すために3の後ろにカンマがついている