LoginSignup
18
21

More than 5 years have passed since last update.

Nampy 基礎とよく使う機能メモ

Last updated at Posted at 2019-01-29

データサイエンス・機械学習を行うに当たって、Numpyの基本的な操作と個人的によく使う機能をまとめました。

NumpyはPythonの科学技術計算に特化したライブラリで、ベクトルや行列などの表現が可能。
公式ドキュメント: http://www.numpy.org/

Numpy基本機能

0.ライブラリのインポート

import numpy as np

1.配列の作成

■ 1次元配列 np.array()

>>> np.array([1, 2, 3])

array([1, 2, 3])

■ 2次元配列 np.array()

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

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

■ print関数で配列をすっきり表示

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

[[1 2 3]
 [4 5 6]]

■ 全ての要素が0である行列を返す np.zeros()

>>> np.zeros((2, 4)) #引数に配列の形態を入力

array([0, 0, 0, 0],
      [0, 0, 0, 0]])

■ 全ての要素が1である行列を返す np.ones()

>>> np.ones((3, 3)) #引数に配列の形態を入力

array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

■ range関数のような連続する1次元の行列を作る(Numpy版 range関数) np.arange()

>>> np.arange(11) #0から1までの連続値

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])


>>> np.arange(0, 16, 3) #0から15までの3ずつ大きくなる連続値

array([0, 3, 6, 9, 12, 15])

■ 指定した範囲内で等間隔に分割された値の行列を作る  np.linspace()

>>> np.linspace(0, 5, 9) #0から5までの範囲を9つに均等に分割 (9つの分割点を返す)

array([0., 0.625, 1.25, 1.875, 2.5, 3.125, 3.75, 4.375, 5.])

■ 単位行列の生成 np.eye()

>>> np.eye(3, 3)

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

■ 全て指定の数値の配列の生成 np.full()

>>> np.full((4, 2), 123)

array([[123, 123],
       [123, 123],
       [123, 123],
       [123, 123]])

2.配列の情報を確認

  • .ndim : 行列の次元を表します。最初に何個 "[" が続いているかに対応します。
  • .shape : 各次元の要素数を表示。
  • .size : 行列の要素の全個数です。
  • .dtype : 要素のデータ型を表します。
a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a.shape #各次元の要素数を確認

(2, 3)

3.配列の参照・変形など

■ インデックス・スライス操作

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

[[1 2 3]
 [4 5 6]]


>>> a[0, 2] #1行目の3列目の値を表示

3 


>>> a[-1, 1] #後ろから1行目(この場合は2列目)の2列目の値を表示

5


print(a[:, 2]) #全行の3列目を表示(:は全てを意味する)

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

[0 1 2 3 4 5]


print(a[:4]) #4つ目まで表示

[0 1 2 3]

print(a[2:5]) #3つ目から5つ目まで表示

[2 3 4]

■ 配列の変形 .reshape()

a = np.array([0, 1, 2, 3, 4, 5])
>>> a

[0 1 2 3 4 5]


>>> a.reshape(3, 2) #3×2に変形

array([[0, 1],
       [2, 3],
       [4, 5]])

#指定した配列の要素数が合わない場合はエラーになる

■ その他

  • .ravel() : 行列を1次元に変換する
  • .flatten() : 行列を1次元に変換する
  • .T : 行列を転置させる
  • .diagonal() : 対角要素を表示

4.乱数

 Python標準のrandomモジュールとは別に、Numpyにも乱数発生機能がある。

■ 0以上1未満の乱数を生成 np.random.random()

>>> np.random.random(10) 

array([0.03554718, 0.74723843, 0.27291435, 0.26284813, 0.79078377,
       0.00814339, 0.41940143, 0.81117724, 0.98409866, 0.38093226])

■ 乱数の固定 np.random.seed()

np.random.seed(0) #同じ乱数が生成される

■ 0以上1未満の高次元の乱数配列生成  np.random.rand()

>>> np.random.rand(3, 4)

array([[0.85371393, 0.87247222, 0.09849451, 0.84980366],
       [0.17332104, 0.84787819, 0.98709454, 0.99205639],
       [0.78306371, 0.8567189 , 0.75677948, 0.60070442]])

■ 指定範囲内の乱数を生成  np.random.randint() / np.random.uniform()

>>> np.random.randint(1, 10, (2, 3)) 
#1次元の場合はタプルでなく数値を入力
#1から10までの整数をランダム生成 <10は出ない>

array([[3, 1, 4],
       [8, 9, 2]])


>>> np.random.uniform(1, 10, (2, 3))
#1から10までの小数値をランダム生成 

array([[6.04938728, 8.58981204, 2.71022283],
       [5.7859627 , 7.2292891 , 9.7463006 ]])

■ 平均0、標準偏差1の標準正規分布に従う乱数の出力  np.random.randn()

>>> np.random.randn(3, 2)

array([[ 0.48735179,  1.70962469],
       [-0.1878482 , -0.22249371],
       [-0.71046488, -1.26965019]])

■ 任意の平均、標準偏差の正規分布に従う乱数の出力  np.random.normal()

>>> np.random.normal(0, 1, (3, 2))  #平均0、標準偏差1、3行2列 で指定

array([[ 0.44271636,  0.0011947 ],
       [-0.11190774,  0.88837843],
       [-0.32281972,  0.62059076]])

5.ユニバーサル関数

 Numpyの関数はメソッド呼び出し可能

  • .sum() : 合計
  • .max() : 最大値
  • .min() : 最小値
  • .mean() : 平均値
  • .var() : 分散
  • .std() : 標準偏差
  • .abs() : 絶対値
  • .floor() : 四捨五入

 axisで行<0>と列<1>を指定可能

  • .min(axis=0) 最小の行を表示
  • .min(axis=1) 最小の列を表示

6.その他機能

■ 内積の計算 np.dot()

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

>>> np.dot(vector_a, vector_b)

32

■ 配列に対して自作の関数を適用したい場合 np.vectorize()

 np.vectorizeは、関数を配列に適用できるように変換する関数

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# ラムダ式で1000を足す関数を作成
add_1000 = lambda x: x + 1000

# np.vectorize()に関数を読み込む
vectorized_add_1000 = np.vectorize(add_1000)

# 配列aに適用
>>> vectorized_add_1000(a)

array([[1001, 1002, 1003],
       [1004, 1005, 1006],
       [1007, 1008, 1009]])
18
21
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
18
21