
データ分析でPythonを使おうとしている.
Numpyの使い方を知りたい.
リストとの違いは何?
そんな方が,Numpyの基本を学べる記事です.
本記事の内容
Pythonは科学技術計算や機械学習などでよく使用されています.そのような領域で使用するデータは大規模なデータシーケンスから構成され,ベクトルや行列演算が多用されます.組み込みデータ型であるリストやタプルよりも高速に配列処理できます.本記事では,Numpyでの配列の作成方法,その後配列の操作方法などを解説します.これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
Pythonの文法基礎から実務的な分析・機械学習まで学べるオンライン学習サービス(1週間無料です)

Numpyとは|配列の作成方法
数値計算を実行するためのライブラリです.多次元配列を効率的に扱うことができます.Python は実行の遅いプログラミング言語ですが,NumPyの内部ではC言語で実装されており,ベクトルや行列などの演算が高速で実行できます.
Numpyでは,多次元配列を格納するための特別なオブジェクトnumpy.ndarrayを使用して計算します.ndarray(N-dimentional array = N次元配列)あるいは略してarrayと呼ばれます.Pythonのリストやタプルと異なり,個々の要素は同じでなければなりません.
Numpyの読み込み方
Numpyモジュールをインポートします.一般的な慣習として,npと短縮した別名でインポートすることが多いです.
import numpy as np

Numpyによる配列の作成
表1. Numpyの配列作成メソッド一覧
| メソッド | 機能 |
|---|---|
| .array() | リストからndarrayオブジェクトを作成 |
| .arrange() | 指定範囲の整数列を作成 |
| .linspace() | 範囲を等分割した値からなる配列を作成 |
| .zeros() | 全ての要素が0のみから成る配列を作成 |
| .ones() | 全ての要素が1のみから成る配列を作成 |
| .full() | 全ての要素が指定した値のみからなる配列を作成 |
| .random() | 0から1までの乱数の作成 |
| .eye() | 単位行列の作成 |
| .reshape() | 引数で指定された形(行数と列数)の多次元配列に変換 |
.array()
num_ex1 = np.array([-3, -2, 1, 0, 1, 2, 3]) num_ex1
num_ex2 = np.array(["砂糖", "塩", "酢", "醤油", "味噌"]) num_ex2
num_ex3= np.array([3, "砂糖", "塩", "酢", "醤油", "味噌", 6.02e23]) num_ex3
多次元配列
xy = np.array([[1,2,3,],[4,5,6,]]) #2次元配列の構築 xy
[4, 5, 6]])
xyz = np.array([[[1,2,3,],[4,5,6,],[7,8,9,]],[[10,11,12],[13,14,15],[16,17,18]]]) #3次元配列の構築 xyz
[ 4, 5, 6],
[ 7, 8, 9]],
[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]]])
3次元配列は行列の配列のように印字されます.
.arange()
np.arange(10)
np.arange(3.05, 3.14, 0.01) #.arange(開始値, 停止値, 間隔)
.linspace()
np.linspace(3.05, 3.14, 10) #.linspace(開始値, 停止値, 分割数)
ちなみに,分割数を指定しなかった場合,デフォルトの要素数は50個です.
.zeros()
np.zeros(2) # 長さ2の1次元配列
タプルで行数と列数を指定して,多次元にすることもできます.
np.zeros((2, 4)) # 2x4の2次元配列
[0., 0., 0., 0.]])
.ones()
np.ones(2)
np.ones((2, 4))
[1., 1., 1., 1.]])
.full
np.full(2, 3) # .full(要素数, 数値)
.random()
np.random.rand(3) # 長さ3の1次元配列
np.random.randn(2,4) # 2×4の2次元配列を生成
[ 2.34391266, 0.78987927, -0.05126123, -0.47948099]])
.eye()
np.eye(3)
[0., 1., 0.],
[0., 0., 1.]])
リストとndarrayの違い
各々の配列に2をかけてみます.リストを2回繰り返した要素を持つリストとなるが,ndarray配列では,ここの要素に2をかけた配列を得ることができます.
list_ex1=[-3, -2, 1, 0, 1, 2, 3] list_ex1*2
num_ex1*2
.reshape()
.reshape()による形状変更も,リストやタプルにはない機能です.
num_ex1.reshape(7,1) # 7行1列のベクトルに変換
[-2],
[ 1],
[ 0],
[ 1],
[ 2],
[ 3]])
np.arange(10).reshape(2,5) # 2行5列の二次元配列に変換
[5, 6, 7, 8, 9]])
属性の確認
表2. Numpyのデータ属性を調べるメソッド一覧
| メソッド | 機能 |
|---|---|
| .dtype() | 配列のデータ型 |
| .ndim() | 配列の次元 |
| .shape() | 配列の形状 |
| .size() | 配列の要素数 |
.dtype()
np.arange(3.05, 3.14, 0.01).dtype
xy.dtype
一方で,これまで,データ型を調べるには,type()関数を使用してきました.
numpyで作成した配列のデータ型を調べると,numpy.ndarrayとなることを確認してみましょう.
type(np.arange(3.05, 3.14, 0.01))
.ndim()
xy.ndim
xyz.ndim
.shape()
num_ex1.shape
xy.shape
2行3列なので,2と3のタプル.
xyz.shape
行列が2つ,各々の中に3行3列なので,2と3と3のタプル.
.size()
xy.size
xyz.size
Numpyでの配列操作

本記事では,よく使う配列操作として,下記2つの操作について解説します.
インデックスによる配列の取得
一次元配列では,リストやタプルと同様に,「インデックス」を用いて要素を抽出したり,スライスしたりすることができます.ただし,二次元配列以上の多次元配列を操作する場合は,高次元(入れ子の外側)から順にインデックスをカンマで区切って指定する点が異なります.


一次元配列のインデックス
num_ex1 = np.array([-3, -2, 1, 0, 1, 2, 3]) num_ex1[0]
二次元配列以上のインデックス
xy = np.array([[1,2,3,],[4,5,6,]]) xy[1] # 行のインデックスのみ指定
xy[1,0] # 行と列のインデックスをまとめて指定
xyz = np.array([[[1,2,3,],[4,5,6,],[7,8,9,]],[[10,11,12],[13,14,15],[16,17,18]]]) xyz[1,0] # 三次元の行列と行のインデックスをまとめて指定
xyz[1,0,1] # 三次元の行列と行と列のインデックスをまとめて指定
一次元配列のスライス
num_ex1[:]
num_ex1[2:4]
num_ex1[0:5:2]
二次元配列以上のスライス
xy[:] # 配列の全要素
[4, 5, 6]])
xy[0:,1:] # 行と列の開始値のインデックスを指定
[5, 6]])
xyz[:] # 配列の全要素
[ 4, 5, 6],
[ 7, 8, 9]],
[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]]])
xyz[1:,0:2] # 三次元の行列と二次元の行列の開始値:停止値のインデックスをまとめて指定
[13, 14, 15]]])
算術演算
前述のリストとndarrayの違いで述べたように,ndarrayはリストと異なり,配列とスカラとの算術演算を記述すると、要素毎のスカラ演算となります.高校数学で習う「行列」の計算です.配列に対して,スカラの加減乗除,整数除算,剰余,べき乗は,要素ごとに演算され,新しい配列が戻ってきます.
num_ex4 = np.arange(10).reshape(2,5) num_ex4 +1
[ 6, 7, 8, 9, 10]])
num_ex5 = num_ex4 + 1 num_ex5 ** num_ex5
[ 46656, 823543, 16777216, 387420489, 10000000000]])
Numpyについて,基本を学べましたでしょうか?
次はMatplotlibというライブラリの使い方について学びましょう!
最後まで読んでくださり,ありがとうございます☺️
