酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

Pythonの配列・行列扱い基礎(numpy)勉強

2019年12月19日 22時52分39秒 | コンピュータ

Pythonの配列扱い基礎(numpy)

こちらのサイトがわかりやすくまとめられている。(numpy以外も)
生成:a = arange(y, x(+1) )、a = array([ ],[ ])
次元表示: a.shape
2次元変換:a.reshape(y, x)
1次元変換:a.flatten
内容確認: type(a),  a.dtype
四則演算:c=a+b
内積: dot(a,b)
などやってみた。

-------------------
  実習経過
-------------------
まずはnumpyライブラリを読み込む
>>> import numpy as np
-------------------
aと言う配列に[0..5]の値をセットする
>>> a = np.arrange(6)   # 6を指定するが0..5になる
-------------------

aという配列に[1..5]までの値を、0.1刻みでセットする
>>> a= np.arrange(1, 5, 0.1)
>>> a
array([1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2,
       2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5,
       3.6, 3.7, 3.8, 3.9, 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8,
       4.9])
※最後の一個はセットされない点に注意
-------------------
2次元配列を作るには2方法
(1) 1次元を定義してshapeを変更する
 [0..9]で0..8個の整数配列を作り3*3にする
>>> a = np.arange(0..9)
>>> a = a.reshape(3,3)
>>> a
array([[0,1,2],
       [3,4,5],
       [6,7,8]])
(2) 初めから値をセットする
>>> a = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
>>> a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
-------------
>>> print(type(a)) # aの型を確認する
<class 'numpy.ndarray'>
>>> print(a.shape)    # a.shape だけでも表示される
(3,3)       # aの次元を確認
>>> a.ndim    # 次元数確認
2
>>> print(
>>> print(a.dtype)
int32

>>> a=0    # aを整数にする
>>> print(type(a))
<class 'int'>

>>> a.flatten()
array([1, 2, 3, 4, 5, 6, 7, 8, 9])  # 表示されただけ

>>> a = a.flatten()    # 代入するとshapeが書き換わって1次元配列になる
>>> a
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(9,)
>>> a[0]    # 0オリジン
1
>>> a[8]    # 最後は[8]
9
>>> a[-1]    # [-1]は最終、[-2]はブービー位置
9

>>> a= np.reshape(a,(3,3))    # 以下は同じ作用
>>> a=a.reshape(3,3)

行列全部に対する演算(ブロードキャスト)
>>> a*10
array([[10, 20, 30],
       [40, 50, 60],
       [70, 80, 90]])
>>> a+10
array([[11, 12, 13],
       [14, 15, 16],
       [17, 18, 19]])

# a,b,を定義して四則演算させる
>>> a
array([7, 8, 9, 4, 2, 6, 1, 3, 5])
>>> b
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c=a-b
>>> c
array([ 6,  6,  6,  0, -3,  0, -6, -5, -4])
>>> c=a*b
>>> c
array([ 7, 16, 27, 16, 10, 36,  7, 24, 45])

numpy.dot()で行列の内積を計算する
>>> a = np.array([[1,2], [3,4]])
>>> b = np.array([[4, 3], [2,1]])
>>> a
array([[1, 2],
       [3, 4]])
>>> b
array([[4, 3],
       [2, 1]])

>>> np.dot(a,b)
array([[ 8,  5],
       [20, 13]])
>>> np.dot(b,a)    # a,b と b,a では結果が違う
array([[13, 20],
       [ 5,  8]])

>>> c=np.dot(a,b)
>>> c
array([[ 8,  5],
       [20, 13]])

-------------
※考え方
 a というオブジェクトをnp.array[]で定義する
 a = np.array()で、()の中に[ ]の値をセットする。これで属性1次元配列ができあがる
 個数は0から始まるので、最大数は-1個で最後の1個は生成されない点に注意
 a はarray属性を継承する 
 2次元配列に見せるために、縦横サイズプロパティをセットするにはa.reshape(y,x)を使用する
  
 初めからarange()を使えば多次元配列を直接定義することが可能
 a=np.array([ [1,2,3],[4,5,6],[7,8,9] ])

 np.arange()関数で初期データを1次元配列としてセットすることが可能
  >>> a.array([ [1,2,3], [4,5,6], [7,8,9] ]) というのはできません。代入しないとダメ

※print()文
 オブジェクトの型(type)とか次元(shape)を表示させる
  type確認は、print(type(a)) であるが、shapeはaのメソッドで表示させるため print(a.shape) で()無し
 typeクラスは標準メソッドなんだろうか?
 shapeなどは「インスタンス変数」と呼ぶ


※エラー
>>> a.flatten      # ()が無い
<built-in method flatten of numpy.ndarray object at 0x064B6188>
>>> a.flatten()
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a.shape()    # sgapeには()は似合わない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
>>> a.shape
(3, 3)

※シャッフル
>>> a=np.arange(1,10)
>>> np.random.shuffle(a)
>>> a
array([8, 3, 1, 7, 5, 4, 6, 9, 2])  # aは書き変えられる














この記事についてブログを書く
« 行列演算(内積)を再勉強 | トップ | 杉天板30mm厚の作業机を作っ... »