🚀

Python|Numpyの基本コマンド

2023/10/02に公開

Numpy(ヌンパイ)とは

ndarray(N次元配列)を作成することができるライブラリ。
高速な処理が可能で、コードがシンプルで読みやすくなる。
そのため、計算負荷が高い処理を行う際は、ndarrayにデータを格納すること。

Numpyの基本コマンド

numpyの読み込み

import numpy as np

ndarrayの作成

np.array([1,2,3])
# array([1,2,3])を作成

np.array(['a',1,2])
# 最初の要素のデータ型に変換された array(['a','1','2'])を作成

np.arange(5)
# 要素数が5の配列 array([0,1,2,3,4]) を作成

np.arange(1,8)
# 指定した始点戸終点の配列 array([1,2,3,4,5,6,7]) を作成

np.zeros([3,5])
# 0で構成された3行*5列の配列を作成

np.ones([3,5])
# 1で構成された3行*5列の配列を作成

np.zeros((3,5))
# 0で構成された3行*5列の配列を作成
# np.zeros([3,5])とほぼ同義。違いは中身のデータ型がリストかタプルかという点。

from numpy.random import *
# rand関数が使えるように読み込み

rand(2,3)
# 0〜1のランダムな数値の2行*3列の配列を作成

ndarrayの参照方法

ary[0]
# 1つ目の四角括弧は行番号を示す

ary[0][1]
# 2つ目の四角括弧は列番号を示す

行列数の変更

ary = np.arange(8)
np.reshape(ary,(2,4))
# reshapeで行列数を変更できる。第1引数に変換元となる配列、第2引数に変換後の行列数を指定。

#上記のコードは以下のコードと同義
ary = np.arrange(8).reshape(2,4)

降順に並び替え

ary = np.arange(40)[::-1]
# [::-1]を付け足すことで、降順に並び変えることができる。

スライス


ary = np.arange(10)
# 配列 array[0,1,2,3,4,5,6,7,8,9] を作成。

ary[4:8]
# 配列aryより、 array[4,5,6,7] のみを取得。

ary[::-1]
# 配列aryを逆順(降順)に並び替えた array[9,8,7,6,5,4,3,2,1,0] を取得。

ary[::2]
# 配列aryを2個飛ばしで抽出した array[0,2,4,6,8] を取得。
# [::N]で「N個飛ばし」を指定することができる。

ary[1::2]
# 配列aryを1を始点にして2個飛ばして抽出した array[1,3,5,7,9] を取得。

np.where

ary = np.array([1,5,0,2,4,6])
np.where(ary != 0)
#0以外が入っているインデックスを取得

np.where( 条件式 )
条件式に当てはまるインデックスを取得できる。

応用1

10x10の大きさの行列で、外側だけが1、内側が全て0の行列。

ary = np.ones((10,10))
ary[1:-1,1:-1] = 0
print(ary)

no.ones((10,10))
1だけで構成された10x10の行列を作成。

ary[1:-1,1:-1] = 0
ary[行,列]の形なので、
aryの2行目から-1行目(最後の行の1つ前の行)まで
aryの2列目から-1列目(最後の列の1つ前の列)までを0に変更する、
という意味になる。

応用2(対角線の取得)

ary = np.arange(9).reshape((3,3))
np.diag(ary)
# 配列aryの対角成分を取得。

np.diag(ary, k=1)
# 配列aryの対角成分を取得する。kは始点を指定するオプション。
# 今回は始点が右(上)に1移動する。負の数にすると、左(下)方向に移動する。

応用3(多次元インデックス)

np.unravel_index(10, (3,5,2))
# 3次元配列(3x5x2)のインデックスが10番目の値を取得できる。

unrabel_index
numpyの関数。1次元のインデックスを多次元配列の形状に基づいて対応する多次元のインデックスに変換することができる。

応用4(正規化)

data = np.random.random((5,5))
datamax, datamin = data.max(), data.min()
data = (data - datamin)/(datamax - datamin)
print(data)
# ランダムな5行*5列の配列を作成し、要素の値を0〜1の間に収めるようにしている。

np.random.random(size)
0以上1未満のランダムな浮動小数点数を生成する。

data.max()
dataの最大値。datamaxに代入された。

data.min()
dataの最小値。dataminに代入された。

data = (data - datamin)/(datamax - datamin)
正規化の式(元の値 - 最小値)/(最大値 - 最小値)に当てはめており、
data行列内の最大値を1、最小値を0に変換している。

応用(行列の掛け算)

ary1 = np.ones((5,3))
ary2 = np.ones((3,2))
np.dot(ary1,ary2)
# ary1とary2の掛け算を実行している。

応用(共通集合の抽出)

ary1 = np.array([1,2,3,4,5])
ary2 = np.array([3,4,5,6,7])
print(np.intersect1d(ary1,ary2))

応用(虚数)

np.emath.sqrt(-1)

虚数
負数の平方根。

emath
複素数に対する数学的な操作をサポートするnumpyのモジュール。単にnp.sqrt(-1)と入力するとエラーが返される。複素数を結果として期待するときはこのモジュールを使う。

応用(日付を扱う)

today = np.datetime64('today', 'D')
day_after_tomorrow  = np.datetime64('today', 'D') + np.timedelta64(2, 'D')

print(today)
# 本日の日付が表示される。

print(day_after_tomorrow)
# 2日後の日付が表示される。

np.datetime64
numpyで日付を扱うデータ型。todayは今日を表し、Dは単位を日付に指定している。つまり、todayには今日の日付が代入されている。

便利なメソッド

print()
引数を表示。

.shape
行列数を取得。

.size
要素数の取得。

.ndim
行列の軸数(次元)の取得。

.dtype
行列のデータ型を取得。

.reshape('配列',(変更後の行数,変更後の列数))
配列の行数、列数を変更することができる。

.max()
最大値を取得。

.min()
最小値を取得。

.mean()
平均値を取得。

.sort()
昇順に並び替え。

参考にさせていただいた記事

https://blog.shikoan.com/numpy-skip-enumerate/
http://ailaby.com/numpy_where/#id1_2
https://qiita.com/tktktks10/items/f85aeef3321f6cbbd368
https://qiita.com/ao_log/items/64768b67153e8fb6820b
https://qiita.com/ryutau/items/0be85eb08dbacadf87a1

Discussion