python3.doc_31
R e i - D r e a m
for Laravel
TOP > Python3 > ライブラリ(numpy)
Guest
login

最終投稿日:2022年6月18日

ライブラリ(numpy)
配列を作成する
※Anaconda をインストールしていれば標準ライブラリに含まれています。
import numpy as np とエイリアスを定義するのが一般的です。
< 書式1 >
np.array( リスト )
np.array( タプル )
例)
import numpy as np
a = np.array([1,2,3])
print(a)                                          ※[1 2 3] 半角スペース区切りとなる!
print(type(a))                              ※ となる
【メモ】
NumPy 配列は要素の型を混在する事はできない。
文字列と数値が混在すると全て文字列型になります。
例)
import numpy as np
a = np.array([1,2,3,'hoge'])
print(a)                                          ※['1' '2' '3' 'hoge']となる
print(a.dtype)
           ※「dtype」で要素の型を調べられる。「<U11」となる(11桁の文字列の意味)
< 書式2 >
np.array( リスト, dtype= 型 )
例)
a = np.array([1,2,3,4.5], dtype=int)
print(a)                                          ※[1 2 3 4]
print(a.dtype)                             ※int32
a = np.array([1,2,3,4.5], dtype=float)
print(a)                                          ※[ 1. 2. 3. 4.5]
print(a.dtype)                             ※float64
a = np.array([1,2,3,'hoge'], dtype='<U3')
print(a)                                          ※['1' '2' '3' 'hog'] ※3文字指定したので「hog」となる
print(a.dtype)                             ※<U3
【メモ】
dtype 引数を利用すれば配列の型変換が可能となります。
例)
a_list = [1,2,3]
a_float = np.array(a_list, dtype=float)
print(a_float)            ※[ 1. 2. 3.] ※NumPy 配列でも通常のリストでも変換できます
a_int = np.array([1,2,3], dtype=int)
a_float = np.array(a_int, dtype=float)
print(a_float)                      ※[ 1. 2. 3.]
1次元配列を多次元配列に変換する
< 書式 >
NumPy配列.reshape( 行数, 列数 )            戻り値:変換された配列
例)
import numpy as np
data = [1,2,3,4,5,6]
a = np.array(data)
b = a.reshape(2,3)
print(b)                                                            ※[[1 2 3] [4 5 6]]
a = np.array(data).reshape(2,3)            ※一気に記述もできる
【注意】
要素の数が整合性がとれていないとエラーとなる。
例で言えば 2 * 3 = 6個の要素が必要となる
上記例の様に配列を生成すると変数 a b は、参照関係となります。
値渡しにしたい場合は以下の様に copy メソッドを使う
a = np.array([1,2,3,4,5,6])
b = a.reshape(2,3).copy()
● 配列の構造を調べる
NumPy配列.shape                                          ※( 行数, 列数 )のタプル型で返却される
● 配列の次元を調べる
NumPy配列.ndim                                          ※次元を int 型で返却する
多次元配列を1次元配列に変換する
< 書式 >
NumPy配列.ravel()            戻り値:変換された配列
NumPy配列.flatten()         戻り値:変換された配列      ※新しくメモリを確保するらしい。。
要素の追加
< 書式 >
np.append( NumPy配列, 値 , axis=None)
np.append( NumPy配列, リスト, axis=None)
np.append( NumPy配列, タプル, axis=None)
例)
import numpy as np
data = np.array([1,2,3,4,5,6])
a = np.append(data,7)
print(a)                                ※[1 2 3 4 5 6 7]
a = np.append(data,[7,8])
print(a)                                ※[1 2 3 4 5 6 7 8]      ※変数 data の内容は変わらないので 7 は重複しない
a = np.append(data,(7,8))
print(a)                                ※[1 2 3 4 5 6 7 8]
● 多次元配列に行を追加する
import numpy as np
data = np.array([[1,2,3],[4,5,6]])
a = np.append(data, [[7,8,9]], axis=0)            ※2次元配列なので [[7,8,9]] とする。
print(a)                                                                        ※[[1 2 3] [4 5 6] [7 8 9]]
● 多次元配列に列を追加する
import numpy as np
data = np.array([[1,2,3],[4,5,6]])
a = np.append(data, [[4],[7]], axis=1)            ※2次元配列なので [[4],[7]] とする。
print(a)                                                                        ※[[1 2 3 4] [4 5 6 7]]
要素の挿入
< 書式 >
np.insert( NumPy配列, 位置, 値 , axis=None )
np.insert( NumPy配列, 位置, リスト, axis=None )
np.insert( NumPy配列, 位置, タプル, axis=None )
例)
import numpy as np
data = np.array([1,2,3])
a = np.insert(data, 1, 4)
print(a)                                          ※[1 4 2 3]
【注意】
文字列の配列の場合は、配列中の要素の最大文字数が上限となっているため文字数を超えた文字列は切られます
例)
import numpy as np
data = np.array(['hoge','foo','bar'])
a = np.insert(data, 1, 'pyshon')
print(a)                      ※['hoge' 'pysh' 'foo' 'bar']
回避するには、文字数を再定義する
例)
import numpy as np
data = np.array(['hoge','foo','bar'])
if len(max(data)) < len('python'):
    data = np.array(data, dtype='● 多次元配列に行を挿入する
例)
import numpy as np
data = np.array([[1,2,3],[4,5,6]])
a = np.insert(data, 1, [7,8,9], axis=0)    ※2次元配列でも append と違い [7,8,9] で良い
print(a)                                                             ※[[1 2 3] [7 8 9] [4 5 6]]
● 多次元配列に列を挿入する
import numpy as np
data = np.array([[1,2,3],[4,5,6]])
a = np.insert(data, 1, 9, axis=1)
print(a)                                                              ※[[1 9 2 3] [4 9 5 6]]
a = np.insert(data, 1, [8,9], axis=1)
print(a)                                                              ※[[1 8 2 3] [4 9 5 6]]
要素の削除
< 書式 >
np.delete( NumPy配列, 位置 )
例)
import numpy as np
data = np.array(['hoge','foo','bar'])
a = np.delete(data, len(data) - 1)      ※len(data) - 1 で、配列の最後のインデックス番号となる
print(a)                                                        ※['hoge' 'foo']
配列の転置
< 書式 >
np.transpose( NumPy配列 )
例)
import numpy as np
data = np.array([[1,2,3],[4,5,6]])
a = np.transpose(data)
print(a)                                          ※[[1 4] [2 5] [3 6]]
a = data.T
print(a)                                          ※[[1 4] [2 5] [3 6]]      ※T でも同じです
配列の次元を上げる
< 書式 >
NumPy配列[ スライスでの範囲, np.newaxis ]
例)
import numpy as np
data = np.array([0,1,2,3,4])
a = data[:,np.newaxis]      ※「:」の前後を省略しているので配列の要素全てが対象
print(a)                                    ※[[0] [1] [2] [3] [4]]
NumPy配列を通常の配列に戻す
< 書式 >
NumPy配列.tolist()
例)
import numpy as np
data = np.array([0,1,2,3,4])
a = data.tolist()
print(a)                                                    ※[0, 1, 2, 3, 4]
data = np.array([[1,2,3],[4,5,6]])
b = data.tolist()
print(b)                                                    ※[[1, 2, 3], [4, 5, 6]]
NumPy配列へのアクセスと値の更新
● 1次元配列
通常のリストと同様です
例)
import numpy as np
data = np.array([0,1,2,3,4])
print(data[1])                                           ※1
print(data[-1])                                          ※4
data[1] = 9
print(data)                                                ※[0 9 2 3 4]
● 多次元配列
NumPy配列[位置 ][ 位置 ]            ※通常のリストと同様
NumPy配列[ 行, 列 ]                       ※NumPy配列独自
例)
import numpy as np
data = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(data[1][2])                                        ※6
print(data[1,2])                                          ※6
data[1,2] = 9
print(data)                                                  ※[[1 2 3] [4 5 9] [7 8 9]]
● 1次元配列のスライス
< 書式 >
        NumPy配列[ 開始位置 : 終了位置 : ステップ ]
【メモ】
ステップを -1 すると配列を降順に並べ替えられる
例)
import numpy as np
a = np.array([1,2,3,4,5,6])
print(a[::-1])                                          ※[6 5 4 3 2 1]
● 多次元配列のスライス
< 書式 >
        NumPy配列[ 行の範囲 , 列の範囲 ]
        例)
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[1:3,1:3])
           ※[[5 6] [8 9]]
            行の範囲が1行目から3行目([[4,5,6],[7,8,9]])、列の範囲が1列目から3列目([[2,3],[5,6],[8,9]])
            0行 0列が最初ですが、最後は n + 1 で指定する必要がる。
NumPy配列による値の抽出
● 1次元配列の for による抽出(全ての要素を順に取り出す)
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
for item in a:
    print(item)                                          ※1から順に9まで出力される
● 多次元配列の for による抽出(全ての要素を順に取り出す)
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
for i, item in np.ndenumerate(a):
    print(i, item)            ※ i には各要素の位置を表す (0,0) 等のタプルが格納される。
● 条件式で要素を抽出する
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
print(a[a > 3])                                          ※[4 5 6 7 8 9] ※3より上の数値を抽出する
a = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(a[a > 3])                                          ※[4 5 6 7 8 9] ※多次元は1次元で返却される
a = np.array([1,2,3,4,5,6,7,8,9])
print(a[(a % 2 == 0) | (a % 3 == 0)])            ※[2 3 4 6 8 9]      ※「or」は「|」で表記する
print(a[(a % 2 == 0) & (a % 3 == 0)])          ※[6]      ※「and」は「&」で表記する
print(a[~(a % 2 == 0)])                                    ※[1 3 5 7 9]      ※「not」は「~」で表記する
● 条件式に合致する値を変更する
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
a[a % 2 == 0] = 0                                ※偶数を 0 に変更する
print(a)                                                  ※[1 0 3 0 5 0 7 0 9]
● NumPy配列のソート
通常のリストクラスの sort メソッドが利用できるが、引数の reverse は使用できないので降順にする場合はスライスを使う
import numpy as np
a = np.array([4,5,6,1,2,3,7,8,9])
a.sort()                                                    ※NumPy配列 a 自体をソートする
print(a)                                                    ※[1 2 3 4 5 6 7 8 9]
print(a[::-1])                                          ※[9 8 7 6 5 4 3 2 1]
NumPy 独自の sort メソッドも利用できる
import numpy as np
a = np.array([4,5,6,1,2,3,7,8,9])
print(np.sort(a))                                ※[1 2 3 4 5 6 7 8 9] ※NumPy配列 a 自体はソートされない
print(np.sort(a)[::-1])                      ※[9 8 7 6 5 4 3 2 1]
NumPy配列による演算
● 四則演算
import numpy as np
a = np.array([10,20,30,40]).reshape(2,2)
b = a + 5
print(b)                                          ※[[15 25] [35 45]]      ※各要素が +5 される
b = a - 5
print(b)                                          ※[[ 5 15] [25 35]]      ※各要素が -5 される
b = a * 2
print(b)                                          ※[[20 40] [60 80]]      ※各要素が *2 される
b = a / 2
print(b)                                          ※[[ 5. 10.] [ 15. 20.]]      ※各要素が /2 される
【メモ】
始点p0(,1,)、終点p1(6,4)のベクトルの距離を求める
※距離を求める NumPy 専用メソッド np.linalg.norm を使用する
例)
import numpy as np
p0 = np.array((1,1))
p1 = np.array((6,4))
a = p1 -p0
print(a)                                          ※[5 3]
l = np.linalg.norm(a)
print(l)                                            ※5.83095189485
● 行列同士の四則演算
import numpy as np
a = np.array([1,2,3,4]).reshape(2,2)
b = np.array([10,20,30,40]).reshape(2,2)
print(a)                                          ※[[1 2] [3 4]]
print(b)                                          ※[[10 20] [30 40]]
print(a + b)                                   ※[[11 22] [33 44]]
行が異なる場合は、行を補完する(補完される配列は行が1行である事!)
例)
import numpy as np
a = np.array([1,2,3,4,5,6]).reshape(3,2)
b = np.array([10,20])
print(a)                                          ※[[1 2] [3 4] [5 6]]
print(b)                                          ※[10 20]
print(a + b)
                                         ※[[11 22] [13 24] [15 26]] ※配列 b の2行目、3行目は1行目と同じ [10 20] として補完される
列が異なる場合は、列を補完する(補完される配列は列が1列である事!)
例)
import numpy as np
a = np.array([1,2,3,4,5,6]).reshape(2,3)
b = np.array([10,20]).reshape(2,1)
print(a)                                          ※[[1 2 3] [4 5 6]]
print(b)                                          ※[[10] [20]]
print(a + b)
           ※[[11 12 13] [24 25 26]]      ※配列 b の2列目、3列目は1列目と同じ [[10] [20]] として補完される
● 合計、最大値、最小値、平均
import numpy as np
a =np.array([56,45,83,67,59,41]).reshape(2,3)
print(a)                                ※[[56 45 83] [67 59 41]]
print(a.sum())                   ※351
print(a.sum(axis=0))      ※[123 104 124]      ※各列の合計      ※引数は省略して 0 とできる
print(a.sum(axis=1))      ※[184 167]      ※各行の合計      ※引数は省略して 1 とできる
print(a.max())                   ※83
print(a.max(axis=0))      ※[67 59 83]
print(a.max(axis=1))      ※[83 67]
print(a.min())                   ※41
print(a.min(axis=0))      ※[56 45 41]
print(a.min(axis=1))      ※[45 41]
print(a.mean())                   ※58.5
print(a.mean(axis=0))      ※[ 61.5 52. 62. ]
print(a.mean(axis=1))      ※[ 61.33333333 55.66666667]
【メモ】
上記は NumPy配列の場合の記述方法。
通常の配列の場合は以下の様に記述する。
import numpy as np
a = [[56,45,83],[67,59,41]]
print(a)
print(np.sum(a))
print(np.max(a,axis=0))
print(np.min(a,axis=1))
● 標準偏差、偏差値
標準偏差とは、データのばらつきの大きさを表わす指標
例)
import numpy as np
sigma = 3.5 # 分散
mu = 65 # 平均
data = sigma * np.random.randn(200) + mu            ※ランダムな200の配列を生成
x = 75                                                                                         ※自分の点数
t_score = 10 * (x - data.mean()) / data.std() + 50     ※偏差値を求める式
print('平均 :',round(data.mean(),1))                         ※平均 : 64.9
print('標準偏差:',round(data.std(),1))                       ※標準偏差: 3.2      ※標準偏差は、str メソッドで求める
print('偏差値 :',round(t_score,1))                               ※偏差値 : 82.0
● 行列の内積を求める
行列の内積は dot メソッドで求める
例)
import numpy as np
a = np.array([1,2,3,4]).reshape(2,2)
b = np.array([5,6,7,8]).reshape(2,2)
print(a)                                                              ※[[1 2] [3 4]]
print(b)                                                              ※[[5 6] [7 8]]
print(np.dot(a,b))                                          ※[[19 22] [43 50]]
【注意】
行列の内積を求めるには、行列Aの列数と行列Bの行数が等しい必要がある。
行列Aが2列なら、行列Bは2行の配列である事
行列Aが2行なら、行列Bは2列の配列である事
● 3次元行列の外積を求める
3次元行列の外積は cross メソッドで求める
例)
import numpy as np
a = np.array([1,2,0])
b = np.array([0,1,-1])
print(a)                                          ※[1 2 0]
print(b)                                          ※[ 0 1 -1]
print(np.cross(a,b))                  ※[-2 1 1]
効率よく配列を作る
● 範囲から配列を作る
通常の range メソッドに対し、NumPy配列の場合は arange メソッドとなる
< 書式 >
numpy.arange(start, stop, step, dtype=None)            ※stop 以外は省略できる
例)
import numpy as np
a = np.arange(10)
print(a)                                          ※[0 1 2 3 4 5 6 7 8 9]
n = 3
m = 4
b = np.arange(n * m).reshape(n,m)
print(b)                                          ※[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
● 行列同士を比較する
行列同士を比較すると構造が同じ場合は、各要素同士を True False で評価します
例)
import numpy as np
a = np.array([1,2,3,4,5,6]).reshape(2,3)
b = np.array([1,2,9,4,8,6]).reshape(2,3)
c = (a == b)
print(c)                                          ※[[ True True False] [ True False True]]
【メモ】
True は 1、False は 0 として扱うため、以下のコードで相違がある個数をカウントする事が可能です。
import numpy as np
a = np.array([1,2,3,4,5,6]).reshape(2,3)
b = np.array([1,2,9,4,8,6]).reshape(2,3)
c = (a != b).sum()
print(c)                                          ※ 2
● 範囲を等分割した配列を作る
arange メソッドと似ているが、あらかじめ step 数が分からなくても、分割数を指定して等間隔に配列を作る事ができる
< 書式 >
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start                      スタート位置
stop                       終了位置
num                       分割数
endpoint              False で stop の数値を含めない
retstep                  True で配列と分割数をタプル型で返却する
dtype                     配列の型
例)
import numpy as np
a = np.linspace(0,120,16,endpoint=False,retstep=True)
print(a)
     ※(array([ 0. , 7.5, 15. , 22.5, 30. , 37.5, 45. , 52.5, 60. , 67.5, 75. , 82.5, 90. , 97.5, 105. , 112.5]), 7.5)
● 単位行列を作る
単位行列とは、以下の様な右肩下がりの要素が 1 で、その他の要素は 0 の正方行列を指します。
[[1,0,0]
[0,1,0]
[0,0,1]]
例)
import numpy as np
a = np.identity(4)                      ※identity メソッドと
b = np.eye(4)                               ※eye メソッドがある(結果は同じ)
print(a)                                          ※[[ 1. 0. 0. 0.] [ 0. 1. 0. 0.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]]
print(b)                                          ※[[ 1. 0. 0. 0.] [ 0. 1. 0. 0.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]]
● ゼロで埋まった配列を作る
import numpy as np
a = np.zeros(9,dtype=int)
b = np.zeros((3,3),dtype=int)
print(a)                                                    ※[0 0 0 0 0 0 0 0 0]
print(b)                                                    ※[[0 0 0] [0 0 0] [0 0 0]]
● 1 で埋まった配列を作る
import numpy as np
a = np.ones(9,dtype=int)
b = np.ones((3,3),dtype=int)
print(a)                                                    ※[1 1 1 1 1 1 1 1 1]
print(b)                                                    ※[[1 1 1] [1 1 1] [1 1 1]]
● 要素を繰り返す
import numpy as np
a = np.array([1,2,3]).repeat(3)
print(a)                                                    ※[1 1 1 2 2 2 3 3 3]
【メモ】
repeat メソッドには引数があり、axis=0 で行を、axis=1 で列を繰り返す
import numpy as np
a = np.arange(6).reshape(2,3)
print(a)                                          ※[[0 1 2] [3 4 5]]
b = a.repeat(2, axis=0)
print(b)                                          ※[[0 1 2] [0 1 2] [3 4 5] [3 4 5]]
c = a.repeat(2, axis=1)
print(c)                                          ※[[0 0 1 1 2 2] [3 3 4 4 5 5]]
● 乱数の配列を作成する
import numpy as np
a = np.random.rand(3)
print(a)            ※[ 0.16874699 0.54152696 0.91538642] ※0.0 ~ 1.0 の乱数が生成される
● 配列をシャッフルする
import numpy as np
a = np.arange(6).reshape(2,3)
print(a)                                ※[[0 1 2] [3 4 5]]
np.random.shuffle(a)
print(a)                                ※[[3 4 5] [0 1 2]] ※バラバラになる(列単位でシャッフルされる)
● CSVファイルを読み込む1
デフォルトでは半角スペースを区切りとして値を読み込む
CSVファイルを読み込む場合は引数 delimiter=',' とする必要がある。
また、1行目にタイトル項目がある場合は skiprows=1 として1行目の読み込みをスキップする必要がある。
例)
import numpy as np
import os
myPath = os.path.dirname(__file__)
a = np.loadtxt(myPath + '/hoge.csv' ,delimiter=',', skiprows=1)
print(a)            ※[[ 100. 200. 300. 400.] [ 101. 201. 301. 401.] [ 102. 202. 302. 402.]]
※ マルチバイト文字には対応していません
● CSVファイルを読み込む2
pandas モジュールを利用する
例)
import pandas as pd
import os
myPath = os.path.dirname(__file__)
myFile = os.path.join(myPath, 'hoge.csv')
a = pd.read_csv(myFile)
b = a.columns.values
c = a.values
print(b)                                ※['hoge' 'foo' 'bar' 'ふが']
print(c)                                ※[[100 200 300 400] [101 201 301 401] [102 202 302 402]]
※配列内にマルチバイトは使えるが、読み込むファイル名、パス名にマルチバイトは使えない
ログインしてコメントを残そう!!


レンズモード 【新規購入限定用】
きっぷる