おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

numpyのテンソル(配列)関係

numpy.transpose(a, axes=None)

配列の足の順番を入れ替える。
a:入れ替えたい配列
axes:順番の指定(指定なしなら、逆順になる)

import numpy as np

a = np.arange(24).reshape((2,3,4))
print a.shape
print np.transpose(a).shape
print a.transpose().shape
print np.transpose(a,(1,0,2)).shape

(2, 3, 4)
(4, 3, 2)
(4, 3, 2)
(3, 2, 4)

np.transpose(a)でもa.transpose()でも同じ役割
axesを指定しなければa[a_1,a_2,...,a_N]をa[a_N,...,a_2,a_1]に入れ替える。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html


掛け算

a*b = np.multiply(a,b) は要素積
np.dot(a,b)は行列積(a,bが高次のテンソルの場合はaの最後の足とbの最後から2番目の足について掛ける)。
他にもいろいろな種類の掛け算が用意されてる。

multiply or *は基本的にa,bの配列の次元は同じでなければならない。
c[i,j,k,l] = a[i,j,k,l]b[i,j,k,l]
同じでない場合は、片方がスカラー
c[i,j,k,l] = ab[i,j,k,l]
もしくは、1次元配列
c[i,j,k,l] = a[l]b[i,j,k,l] #1次元配列と一方の配列の最後の要素の掛け算になる
でないとだめっぽい。
また、a*bとb*aは同じものを返すっぽい。

import numpy as np

A = np.arange(24).reshape((2,3,4))
B = np.array([1,2,3,4])
print A.shape
print B.shape
print (A*B).shape
print (B*A).shape
print np.multiply(A, B).shape

(2, 3, 4)
(4,)
(2, 3, 4)
(2, 3, 4)
(2, 3, 4)

http://ibisforest.org/index.php?python%2Fnumpy
http://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html

【追記】任意の軸に関する要素積について、別に記事を書いたので、必要なら参照:
http://oppython.hatenablog.com/entry/2014/10/23/024831