今日も AIを学ぶ為の本格Python講座 を進めた。
Numpyは良く使うようなので、何回も使って、
覚えておきたい。
■AIを学ぶ為の本格Python講座
PY11_Numpy_行列の作成・取り扱い1
PY12_Numpy_行列の作成・取り扱い2
PY13_Numpy_行列の作成・取り扱い3
今日学んだこと
Numpyについて
dtype
要素の型を指定する。
>>> import numpy as np
>>>
>>> a=np.array([1,2,3,4,5])
>>> a
array([1, 2, 3, 4, 5])
>>>
>>> b=np.zeros(10,dtype=int)
>>> b
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>>
>>> np.ones((3,5),dtype=float)
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
>>>
少数には数字のあとに「.」がつく
指定した数値で行列を作る
3行5列で、要素が3.14の行列
>>> np.full((3,5),3.14)
array([[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14]])
>>>
0から20の間で、3飛ばしの行列
>>> np.arange(0,20,3)
array([ 0, 3, 6, 9, 12, 15, 18])
>>>
0から1までを5等分して行列を作成
>>> np.linspace(0,1,5)
array([0. , 0.25, 0.5 , 0.75, 1. ])
>>>
>>>
3行4列で、0から1の間の要素をランダムで作成
>>> np.random.random((3,4))
array([[0.95725462, 0.95480925, 0.34104836, 0.25397855],
[0.93361683, 0.74180502, 0.39543056, 0.52519348],
[0.99334372, 0.94659274, 0.62351176, 0.10174267]])
>>>
正規分布の行列
引数は、1つ目 平均 2つ目 分散 3つ目 行列の要素数
>>> np.random.normal(0,1,(3,3))
array([[-0.91659746, 0.13787186, 0.1870367 ],
[-0.01629448, 0.17056408, 1.24228387],
[-0.15801499, -1.20015543, 0.66345253]])
>>>
0から20の間の整数でランダムに要素を作成。行列は3行4列
画像のデータを作成するのに使う場合がある
0から255のランダムの要素を作成する。
>>> np.random.randint(0,20,(3,4))
array([[11, 8, 2, 10],
[12, 11, 6, 17],
[13, 13, 6, 12]])
>>>
単位行列の作成
>>> np.eye(4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
>>>
データセットdigits
0から9の手書き数字が書かれた8×8ピクセルの小さな画像と、画像に何の数字が書かれているかの答えの情報の2つから構成されている。
情報のペアは1797個。
機械学習で、何の画像か当てる練習に使ったりする。
>>> from sklearn import datasets
>>>
データセットを読み込む
>>> mnist=datasets.load_digits()
>>>
画像の情報を表示
digitsは白黒で、0~255で表現される。
>>> mnist['images']
array([[[ 0., 0., 5., ..., 1., 0., 0.],
[ 0., 0., 13., ..., 15., 5., 0.],
[ 0., 3., 15., ..., 11., 8., 0.],
...,
[ 0., 4., 11., ..., 12., 7., 0.],
[ 0., 2., 14., ..., 12., 0., 0.],
[ 0., 0., 6., ..., 0., 0., 0.]],
[[ 0., 0., 0., ..., 5., 0., 0.],
[ 0., 0., 0., ..., 9., 0., 0.],
[ 0., 0., 3., ..., 6., 0., 0.],
...,
[ 0., 0., 1., ..., 6., 0., 0.],
[ 0., 0., 1., ..., 6., 0., 0.],
[ 0., 0., 0., ..., 10., 0., 0.]],
[[ 0., 0., 0., ..., 12., 0., 0.],
[ 0., 0., 3., ..., 14., 0., 0.],
[ 0., 0., 8., ..., 16., 0., 0.],
...,
[ 0., 9., 16., ..., 0., 0., 0.],
[ 0., 3., 13., ..., 11., 5., 0.],
[ 0., 0., 0., ..., 16., 9., 0.]],
...,
[[ 0., 0., 1., ..., 1., 0., 0.],
[ 0., 0., 13., ..., 2., 1., 0.],
[ 0., 0., 16., ..., 16., 5., 0.],
...,
[ 0., 0., 16., ..., 15., 0., 0.],
[ 0., 0., 15., ..., 16., 0., 0.],
[ 0., 0., 2., ..., 6., 0., 0.]],
[[ 0., 0., 2., ..., 0., 0., 0.],
[ 0., 0., 14., ..., 15., 1., 0.],
[ 0., 4., 16., ..., 16., 7., 0.],
...,
[ 0., 0., 0., ..., 16., 2., 0.],
[ 0., 0., 4., ..., 16., 2., 0.],
[ 0., 0., 5., ..., 12., 0., 0.]],
[[ 0., 0., 10., ..., 1., 0., 0.],
[ 0., 2., 16., ..., 1., 0., 0.],
[ 0., 0., 15., ..., 15., 0., 0.],
...,
[ 0., 4., 16., ..., 16., 6., 0.],
[ 0., 8., 16., ..., 16., 8., 0.],
[ 0., 1., 8., ..., 12., 1., 0.]]])
>>>
target 各画像の答えの情報
>>> mnist['target']
array([0, 1, 2, ..., 8, 9, 8])
>>>
ndim 行列の次元数を表現する。
>>> mnist['images'].ndim
3
>>>
>>> mnist['target'].ndim
1
>>>
shape 行列の形状を得る。
8行8列の行列が1797個ある。
>>> mnist['images'].shape
(1797, 8, 8)
>>>
>>> mnist['target'].shape
(1797,)
>>>
コマンド確認
行列の作成
>>> test1=np.zeros(11,dtype=np.float16)
>>>
>>> test1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float16)
>>>
>>>
>>> test2=np.zeros((6,4),dtype=np.uint8)
>>>
>>> test2
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=uint8)
>>>
>>>
>>> test3=np.zeros((5,2,4),dtype=np.float32)
>>> test3
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]]], dtype=float32)
>>>
次元数
>>>
>>> test1.ndim
1
>>>
>>> test2.ndim
2
>>>
>>> test3.ndim
3
行列の形
ndimを使わなくてもshapeの要素数で次元が分かる
>>> test1.shape
(11,)
>>>
>>> test2.shape
(6, 4)
>>>
>>> test3.shape
(5, 2, 4)
>>>
>>>
要素の数
>>> test1.size
11
>>>
>>> test2.size
24
>>>
>>> test3.size
40
>>>
データ型
>>> test1.dtype
dtype('float16')
>>>
>>> test2.dtype
dtype('uint8')
>>>
>>> test3.dtype
dtype('float32')
>>>
ビュー
行列の一部を取り出す。
矩形切り出し?できる。
取り出したものに対して、値を変えるなど変更を加えると
元の行列も変更される。
元の行列は変更したくない場合は、コピーする。
2×2の行列分を抜き出す
>>> test5=np.random.randint(0,10,(3,4))
>>> test5
array([[7, 6, 7, 9],
[2, 6, 2, 1],
[1, 6, 9, 3]])
>>>
>>> test5_sub=test5[:2,:2]
>>> test5_sub
array([[7, 6],
[2, 6]])
>>>
ちなみにこれと同じこと
>>> test5_sub=test5[0:2,0:2]
>>>
>>> test5_sub
array([[12, 11],
[10, 6]])
>>>
値を変更すると、もとのtest5も変更される。
>>> test5_sub[0,1]
6
>>>
>>> test5_sub[0,1]=99999
>>>
>>> test5_sub[0,1]
99999
>>>
>>>
>>> test5_sub
array([[ 7, 99999],
[ 2, 6]])
>>>
>>> test5
array([[ 7, 99999, 7, 9],
[ 2, 6, 2, 1],
[ 1, 6, 9, 3]])
>>>
コピー
ビューで取り出したものは、値を変更すると
元の行列も変化してしまうので、明示的にコピーして
別の行列を作る。
>>> test5
array([[ 7, 99999, 7, 9],
[ 2, 6, 2, 1],
[ 1, 6, 9, 3]])
>>>
コピーを作成する。
>>> test5_sub_copy=test5[:2,:2].copy()
>>> test5_sub_copy
array([[ 7, 99999],
[ 2, 6]])
値を変更しても元の行列(test5)は変化していない。
>>> test5_sub_copy[0,1]
99999
>>> test5_sub_copy[0,1]=99
>>>
>>> test5_sub_copy[0,1]
99
>>>
>>> test5_sub_copy
array([[ 7, 99],
[ 2, 6]])
>>>
99にならず、99999のまま
>>> test5
array([[ 7, 99999, 7, 9],
[ 2, 6, 2, 1],
[ 1, 6, 9, 3]])
>>>
>>>
勉強時間
今日: 1.5時間
総勉強時間: 31.5時間
お得キャンペーンの紹介
ラビットチャレンジの
Amazonギフト券「5,000円」プレゼントキャンペーンのお知らせ
申込時に、以下コードを使えば、入会金が5000円引かれるようです。
また、紹介した僕にも5000円のAmazonギフト券が送られるようです。
お得なので、よかったら申込時お使いください。
紹介コード:friend0019697
※本キャンペーンの期間は、 2021年9月15日~10月31日 です。
「お友達紹介キャンペーン」特設ページ:
https://ai99