12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

numpyの基本テクニック

Last updated at Posted at 2019-02-04

numpyとはpythonにおいて数値計算を行うことができるライブラリで、多次元配列や行列を簡単に計算出来るため、機械学習では必須テクニックとなります。
今回は、そのnumpyの基本的なテクニックをメモしておきます。

#numpyの基本テクニック
##import

import numpy as np

##基本的な配列の生成
配列の生成には、np.array()メソッドを使う。

  • 1*3の配列
np.array([1,2,3])

スクリーンショット 2019-02-04 21.32.56.png

  • 3*3の配列
np.array([[1,2,3],[4,5,6],[7,8,9]])

スクリーンショット 2019-02-04 21.33.23.png

##形状の確認
配列の形状を確認するには、shape属性を参照すると形状が確認できます。

  • 3列の形状
array = np.array([1,2,3])
array.shape

スクリーンショット 2019-02-04 21.33.53.png

  • 3*2の配列
array = np.array([[1,2],[3,4],[5,6]])
array.shape

スクリーンショット 2019-02-04 21.35.07.png

  • 配列が何行なのか参照
array.shape[0]

スクリーンショット 2019-02-04 21.36.40.png

  • 配列が何列なのか参照
array.shape[1]

スクリーンショット 2019-02-04 21.37.33.png

##形状の変換
形状の変換にはrehapeメソッドを使います。
特に列ベクトル(列数1の行列)への変換、多次元配列の1次元への変換は必須テクニックとなります。

array = np.array([[1,2],[3,4],[5,6]])

  • 2*3列に変換
array.reshape(2,3)

スクリーンショット 2019-02-04 21.40.41.png

  • X行1列に変換
array.reshape(-1,1)

スクリーンショット 2019-02-04 21.44.13.png

  • 配列を1次元に変換
array.ravel()

スクリーンショット 2019-02-04 21.46.39.png

##選択と抽出
配列の一部を選択・抽出したい場面は多くあります。
特に:(スライス)のテクニック忘れないように。

array = np.array([[1,2],[3,4],[5,6]])

  • 1一行目を抽出
array[0]

スクリーンショット 2019-02-04 21.49.01.png

  • 2行目以降を抽出
array[1:]

スクリーンショット 2019-02-04 21.52.23.png

  • 2行目までを抽出
array[:2] 

スクリーンショット 2019-02-04 21.53.07.png

  • 1行目の2列目を抽出
array[0, 1] #array[0][1]

スクリーンショット 2019-02-04 21.54.04.png

  • 2列目のみ抽出
array[:, 1]

スクリーンショット 2019-02-04 21.55.20.png

##条件による選択
配列から、ある条件を満たす要素のみを取り出したい時や、ある条件を満たす要素を別の値に置き換えたい場合は、whereメソッドなどを使う。

array = np.array([[1,2],[3,4],[5,6]])

  • 2を境にture,falseで返す
array > 2

スクリーンショット 2019-02-04 21.58.14.png

  • 2以上の数値を返す
array[array > 2]

スクリーンショット 2019-02-04 21.59.20.png

ある条件を満たす要素を置き換える時は、whereメソッドを使う。引数の条件は(条件、 置き換える値、 条件を満たさない要素の値)。

  • yが0.5以上で1、0.5以下で0を返す
x = np.arange(20).reshape(-1,1)
y = np.random.rand(20)
y = np.where(y < 0.5, 0, 1).reshape(-1,1)

スクリーンショット 2019-02-04 22.00.58.png

  • xのうちyが1になった値のみを抽出
x = np.arange(20).reshape(-1,1)
y = np.random.rand(20)
y = np.where(y < 0.5, 0, 1).reshape(-1,1)

スクリーンショット 2019-02-04 22.02.18.png

##配列の結合
vstackは縦方向、hstackは横方向にそれぞれ配列を結合します。

  • 縦方向に結合
array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8],[9,10],[11,12]])
np.vstack([array_1,array_2])

スクリーンショット 2019-02-04 22.05.12.png

  • 横方向に結合
array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8],[9,10],[11,12]])
np.hstack([array_1,array_2])

スクリーンショット 2019-02-04 22.06.35.png

なお異なった形状の配列は結合することはできません。

array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8,9,10,11,12]])
print(array_1.shape)
print(array_2.shape)

スクリーンショット 2019-02-04 22.07.53.png

##便利な配列生成方法

  • 範囲を指定して配列を生成
np.arange(0, 10)

スクリーンショット 2019-02-04 22.09.09.png

  • 全ての配列が0の配列を生成。同様に1の配列はonesを使う。
np.zeros([3, 3])

スクリーンショット 2019-02-04 22.10.28.png

  • 指定した配列と同じ形状の0行列を生成。同様にoneslikeもある。
array = np.array([[1,2],[3,4],[5,6]])
np.zeros_like(array)

スクリーンショット 2019-02-04 22.11.39.png

  • 指定した範囲を等間隔で分割した配列を生成
np.linspace(0, 2, 5)

スクリーンショット 2019-02-04 22.12.24.png

##乱数の生成
乱数の生成には、主にrandn,rand,randintのいずれかを使います。
乱数を固定するには、np.random.seed()を指定します

  • 標準正規分布(平均0、分散1)に従って乱数を生成
 np.random.randn(10)

スクリーンショット 2019-02-04 22.16.37.png

  • 0から1までの範囲で乱数を生成
np.random.rand(10)

スクリーンショット 2019-02-04 22.17.44.png

  • 指定した範囲の整数をランダムに抽出
np.random.randint(0, 100, 10) #0から100を10個生成する

スクリーンショット 2019-02-04 22.19.09.png

##四則演算
もちろん四則演算も可能です。

array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8],[9,10],[11,12]])

array_1 + array_2

スクリーンショット 2019-02-04 22.21.43.png

array_1 - array_2

スクリーンショット 2019-02-04 22.22.19.png

array_1 * array_2

スクリーンショット 2019-02-04 22.23.05.png

array_1 / array_2

スクリーンショット 2019-02-04 22.23.50.png

  • 累乗
array_1 ** 2 #もしくはnp.sqrt(array_1)

スクリーンショット 2019-02-04 22.24.43.png

  • 指数関数
np.exp(array)

スクリーンショット 2019-02-04 22.25.37.png

  • 対数関数
np.log1p(array)

スクリーンショット 2019-02-04 22.26.17.png

##各種統計量

array = np.random.randint(0, 100, 20)

  • 合計、平均、分散、標準偏差、最大値、最小値
np.sum(array)
np.mean(array)
np.var(array)
np.std(array)
np.max(array)
np.argmax(array) #最大値のインデックス
np.min(array)
np.argmin(array) #最小値のインデックス

##その他便利なやつ

array.dtype #データの型を調べる
array = np.random.randint(0, 100, 20, dtype="int32") #データの型を指定して配列を生成する(int32)
np.round(array, 2) #小数点以下2桁に揃える
12
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?