Pythonライブラリ講座

【NumPy】配列の最大値・最小値・平均の求め方は?その他基本的なメソッドを紹介!

前のページ|次のページ

3章ではNumPy配列(ndarray)の『統計量(総和・最大値・最小値・平均・累積和)を取得する方法』『次元数・形状・全要素数を取得する方法』について説明します。

また、配列をソートする『sort()』関数および『sortメソッド』について解説します。

練習問題も充実していますので、ぜひ最後まで読んでいってください!

本連載講座【Python ライブラリ編】では、データサイエンスに必要なPythonライブラリやその使い方を基礎から学ぶことができます。

NumPyPandasMatplotlibScipySeabornについて、初学者の方にも分かりやすいよう丁寧に解説しています。

さらに、学習した内容を定着させられるように各章演習問題を用意しています。

・Pythonでデータ分析ができるようになりたい

・Pythonの基礎事項は一通り学んだので、さらに深く学びたい

このように考えている方はTech Teacherが運営する【Python ライブラリ編】で、Pythonによるデータサイエンスの学習をすることをお勧めします!

なお、『Pythonについて全く知らない』・『Pythonの基礎事項がまだ分かっていない』という方は、まずコチラの【Python 基礎編】で基礎を一通り学習してからライブラリ編に取り掛かりましょう!

<ライブラリ編 目次>

<ライブラリの基礎>
1章:ライブラリとは

<NumPy>
2章:NumPyの概要と配列(ndarray)
3章:統計量や次元の取得/ソート
4章:配列のインデックス
5章:numpy.whereによる条件制御
6章:配列の結合/分割
7章:乱数

<SciPy>
8章:SciPyの概要と基本操作

<Pandas>
9章:SeriesDataFrame/統計量の取得
10章:データの読み込み/書き込み
11章:データの取り出し/追加
12章:データのソート
13章:データの結合
14章:階層型インデックス
15章:groupbyによる集計
16章:マッピング処理
17章:欠損値の扱い

<Matplotlib>
18章:Matplotlibの概要
19章:pyplotインターフェース
20章:オブジェクト指向インターフェース

<Seaborn>
21章:Seabornの概要と基本操作

配列の統計量を取得するメソッド

NumPyの配列はクラスとして定義されるため、多くの便利なメソッドを用いて効率的にデータ分析を行うことができます。

クラスがまだよく分かっていない・理解に不安があるという方は、以下の記事で基礎から丁寧に解説しているので、ぜひ参照してください。

まずは基本中の基本である、統計量(平均値などの統計的な値)を取得するメソッドを紹介します。

総和を取得:sum()

sum()』は配列の総和を取得するメソッドです。

引数を省略した場合、配列の全要素の総和を返します。

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

print(data.sum())
[[1 2 3]
 [4 5 6]]
21

また多次元配列に対しては、引数を指定することで列ごと・行ごとの総和を取得できます。

print(data.sum(0)) #列ごとの総和
print(data.sum(1)) #行ごとの総和
[5 7 9]
[ 6 15]

最大値・最小値を取得:min()・max()

min()』『max()』を用いて、配列の最大値および最小値を取得することができます。

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

print(data.max())
print(data.min())
[[1 2 3]
 [4 5 6]]
6
1

またsum()と同様に、列ごと・行ごとの最大値・最小値も得ることができます。

print("最小値:")
print(data.min(0)) #列ごとの最小値
print(data.min(1)) #行ごとの最小値

print("最大値:")
print(data.max(0)) #列ごとの最大値
print(data.max(1)) #行ごとの最大値
最小値:
[1 2 3]
[1 4]
最大値:
[4 5 6]
[3 6]

平均を取得:mean()

mean()』を用いると、配列の要素の平均値(算術平均)を取得できます。

こちらもsum()などと同様に列ごと・行ごとに平均を算出できます。

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

print(data.mean())
[[1 2 3]
 [4 5 6]]
3.5
print(data.mean(0)) #列ごと
print(data.mean(1)) #行ごと
[2.5 3.5 4.5]
[2. 5.]

累積和を取得:cumsum()

cumsum()』を用いると、配列の累積和を求めることができます。

累積和とは、それ以前までの配列の要素の和のことです。実際にどのようなものか確認してみましょう。

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

print(data.cumsum())
[ 1  3  6 10 15 21]

1番目の要素は1、2番目の要素は1+2=3、3番目の要素は1+2+3=6…と、累積した和を要素として持つことが分かります。

また、多次元配列の場合、引数を指定せずに用いると1次元配列のときと同じ結果が得られます。

0または1の引数を指定すれば、列ごと・行ごとの累積和を取得できます。

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

print(data.cumsum())
print(data.cumsum(0)) #列ごと
print(data.cumsum(1)) #行ごと
[[1 2 3]
 [4 5 6]]
 
[ 1 3 6 10 15 21] [[1 2 3] [5 7 9]] [[ 1 3 6] [ 4 9 15]]

その他の配列情報を取得する方法

NumPyで定義された配列は、次元数形状要素数などの情報をメンバとして持ちます。

メンバ』とは、インスタンスが持つ変数(インスタンス変数)や関数(メソッド)の総称です。

そしてこれらのメンバにアクセスするためには『プロパティ』と呼ばれるものを用います。

プロパティ』とは、簡潔に言うと「インスタンス名.プロパティ名」として(メンバ変数のように)参照できる関数のことです。

プロパティについてここでは詳しく扱いませんが、以下の方法で次元数などを取得する方法を覚えておきましょう。

次元数の取得:ndimプロパティ

ndim』プロパティを用いることで、配列の次元数を求めることができます。例えば2次元配列のときは2が返されます。

arr1 = np.array([1,2,3,4,5]) #1次元配列
arr2 = np.array([[1,2,3], [4,5,6]]) #2次元配列

print(arr1.ndim)
print(arr2.ndim)
1
2

配列の形状を取得:shapeプロパティ

shape』プロパティは配列の形状を返します。例えば2行3列(2×3)の配列の場合、「(2, 3)」というタプルが返されます。

arr1 = np.array([1,2,3,4,5]) #1×5配列
arr2 = np.array([[1,2,3], [4,5,6]]) #2×3配列

print(arr1.shape)
print(arr2.shape)
(5,)
(2, 3)

上の例において1次元配列のshapeが「(5,)」となっていますが、これは長さ5の1次元配列の形状を表しています。

1次元配列においては、「(1, 5)」の最初の1を省略し5のみを要素として持つタプルを返すという仕様により、このような結果が得られます。

全要素数を取得:sizeプロパティ

size』プロパティを用いると、配列の全要素数を求めることができます。

arr1 = np.array([1,2,3,4,5]) #1×5配列
arr2 = np.array([[1,2,3], [4,5,6]]) #2×3配列

print(arr1.size)
print(arr2.size)
5
6

ndarrayの並べ替え(ソート)

Pythonのリストと同じように、NumPyの配列(ndarray)は以下の2つの方法でソートを行うことができます。

  • 要素を並べ替えた新たな配列を作る方法(非破壊的なソート)
  • もとの配列そのものを並べ替える方法(破壊的なソート)

非破壊的なソート:numpy.sort()

NumPyの『sort()』関数を用いることで、引数に指定した配列の要素を並べ替えた、新たな配列が得られます。

np.sort()はデフォルトでは昇順ソートとなります。

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

y = np.sort(x) #sort()関数
print("x:{}".format(x)) #元の配列は変更されていない
print("y:{}".format(y))
x:[1 5 3 4 2]
y:[1 2 3 4 5]

破壊的なソート:sortメソッド

sortメソッド』を用いると、配列自身をソートすることができます。

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

x.sort() #xそのものが変更される
print(x)
[1 2 3 4 5]

降順で並べ替える方法

sort()』関数、『sortメソッド』ともに、降順で並べ替えるにはインデックスのスライスを用います。

sort()関数を用いる場合、インデックスはsort()の後に書きます。

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

y = np.sort(x)[::-1]
print("x:{}".format(x)) #元の配列は変更されていない
print("y:{}".format(y))
x:[1 5 3 4 2]
y:[5 4 3 2 1]

一方sortメソッドを用いる場合、インデックスは配列の直後(.sort()の前)に書きます。

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

x[::-1].sort() #xそのものが変更される
print(x)
[5 4 3 2 1]

3章の練習問題

以下の練習問題を解いてみましょう。

練習問題

問1. 以下の配列xに対して、(1)~(5)を求めてください。

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

(1) xの総和
(2) xの最大値・最小値
(3) xの算術平均
(4) xの累積和
(5) xを昇順で並べ替えた配列
(6) xを降順で並べ替えた配列

問2. 以下の多次元配列yに対して、(1)~(3)を求めてください。

y = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15]])

(1) xの次元数
(2) xの形状
(3) xの全要素数

解答

問1(クリックして解答を表示)

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

#(1)
print(x.sum())
#(2)
print(x.max(), x.min())
#(3)
print(x.mean())
#(4)
print(x.cumsum())
#(5)
print(np.sort(x))
#(6)
print(np.sort(x)[::-1])
55
10 1
5.5
[ 1  6 16 22 30 33 37 39 48 55]
[ 1  2  3  4  5  6  7  8  9 10]
[10  9  8  7  6  5  4  3  2  1]

問2(クリックして解答を表示)

y = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15]])

#(1)
print(y.ndim)
#(2)
print(y.shape)
#(3)
print(y.size)
2
(3, 5)
15

次のページへ

NumPy配列のインデックスとスライスを解説!条件に応じてデータを抽出する方法 前のページ|次のページ 4章ではNumPy配列(ndarray)の『インデックス』と『スライス』および『ブールインデックス参照』...