AI E資格

ラビットチャレンジでE資格に挑戦 48日目

今日も 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

-AI, E資格