猫も杓子も構造化

発達障害、特別支援などについて書いています。最近は心理学関係の内容が多めです。

Pythonでのベクトル処理

Python初学者が戸惑ったとことかを備忘録がてらメモしておく。

Rとの違いでまず迷ったのがベクトルとスカラーの演算である。

例えば、Rだとあまり何も考えずにオブジェクトにベクトルを放り込んで演算をすれば勝手にやってくれる。

> a <- c(1:20)
> a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> a + 1
 [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21
> a * 2
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
> b <- c(21:40)
> a + b
 [1] 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60
> a * b
 [1]  21  44  69  96 125 156 189 224 261 300 
341 384 429 476 525 576 629 684 741 800

ところがpythonでこのノリは通用せずエラーを吐き出す。掛け算ではリストの要素を2回繰り返される。

>>> a = list(range(20))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> a + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list

>>> a * 2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]


pythonでベクトルの演算をするにはどうすれば良いかといえば、numpyというライブラリを使うと良いらしい。使うのはarray()という配列を作る関数で、リストを読み込めば、1次元の配列(つまりはベクトル)が生成され、ネストされたリストを読み込めばN次元の配列が作られるようだ。

>>> import numpy as np
>>> aa = np.array(a)
>>> aa
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
 11, 12, 13, 14, 15, 16, 17, 18, 19])

>>> aa + 1
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

>>> aa * 2
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20,
 22, 24, 26, 28, 30, 32, 34, 36, 38])

ちなみに、片方が配列であれば、もう片方が普通のリストであっても配列同士の演算がされるようだ。リスト同士の演算と比べて見ると差がわかる。

>>> aa + b
array([20, 22, 24, 26, 28, 30, 32, 34, 36, 38,
 40, 42, 44, 46, 48, 50, 52, 54, 56, 58])

>>> a + b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]


やはり、統計解析を主たる目的で作られている言語と汎用的な言語ということで勝手は色々違うみたいですね。