Python

PythonのNumpy配列を使いこなす

By 2021年3月24日March 25th, 2021No Comments

「Numpyについてなんとなくは理解したけど、結局どう使うの?」

「関数が多くて使いこなせない」

Numpyを学習し始めた人の中にはこのように思う方も多いのではないでしょうか。

今回の記事では、Numpyの配列(データ)を処理するにはどのような操作を行えばよいのかについて解説します。配列に対してよく行う操作を、サンプルコードを多く用いて解説します。初学者の人にはもちろん、復習したい人にもおすすめです。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト

また、Numpyとは何か、Numpyで何ができるのかについては以下の記事で解説しているので参照してください。

Numpyの使い方 – 本町オープンソースラボ -大阪でのIT勉強会多数開催!大阪本町のエンジニア向けコミュニティ- (hosl.dev)

要素の抽出

データを扱う際には自分のほしいデータをすぐに取り出せることが重要です。このセクションでは、NumPy配列から条件を満たす要素・行・列を抽出(取得)する方法を説明していきます。

指定した位置の値を取り出す

一次元配列と二次元配列から位置を指定して要素を取り出す方法です。

import numpy as np  # numpyを使うにはまずimportする
x = np.arange(8)  # 一次元配列
print(x)
# [0 1 2 3 4 5 6 7]
print(x[2])  # プログラミング言語では0からデータを数えるので3つ目を出力
# 2
print(x[5])
# 5
y = np.arange(12).reshape(3, 4)  # 二次元配列
print(y)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
print(y[2, 3])
# 11 
# 3行4列目の値を抽出、2行3列目ではないことに注意

指定した範囲の値を取り出す

範囲を指定して値を取り出すにはx[始点:終点:間隔]のように指定します。

2次元配列のときはx[行, 列]として、行の部分で行の指定、列の部分で列の指定を行います。

print(x)
# [0 1 2 3 4 5 6 7]

print(x[1:4])
# [1 2 3]
# 終点の値は含まれません。間隔は、省略すると1になります

print(x[5:])
# [5 6 7]
# 5以降をすべて抽出

print(y)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(y[2:, 2:])
# [[10 11]]
# 行は3行目以降、列は3列目以降の範囲の値を取り出します

偶数列、奇数列、不規則な列を取り出す

間隔をうまく取り入れると偶数列、奇数列を取り出すことができ、同じようにして偶数行、奇数行を取り出すこともできます。不規則な列の取り出し方も紹介します。

x = np.arange(24).reshape(4, 6) # reshapeは次のセクションで解説します
print(x)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
# [12 13 14 15 16 17]
# [18 19 20 21 22 23]]

print(x[:, ::2])  # 偶数列:行指定なし、列は2列ごとに抽出します
# [[ 0  2  4]
#  [ 6  8 10]
#  [12 14 16]
#  [18 20 22]]

print(x[:, 1::2])# 奇数行:行指定なし、列は1列目から2列ごとに抽出します
# [[ 1  3  5]
#  [ 7  9 11]
#  [13 15 17]
#  [19 21 23]]
print(x[:, [0, 2, 3]])# 不規則な列:行指定なし、ほしい列を[]で指定する
# [[ 0  2  3]
#  [ 6  8  9]
#  [12 14 15]
#  [18 20 21]]

配列の変形

配列における計算では、配列の形(shape)がとても重要になります。このセクションでは

reshape関数の使い方を解説します。以下のサンプルコードでは8つの要素からなる一次元配列を2行4列の二次元配列に変形しています。

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(x.size)
# 8

y = x.reshape(2, 4)  # 二次元配列に変形します
# ()内の数字を掛けたら.sizeと同じ大きさになる必要があります
print(y)
# [[1 2 3 4]
#  [5 6 7 8]]

z = x.reshape(2, 2, 2)  # 三次元配列にも変形できます
print(z)
# [[[1 2]
#   [3 4]]
#  [[5 6]
#   [7 8]]]

多次元配列を一次元配列に変形するときはflatten関数を使います。reshape関数でも同じことができますがflatten関数のほうが高速かつシンプルにコードを書くことができます。

print(y)
# [[1 2 3 4]
#  [5 6 7 8]]
y1 = y.flatten()  # 行方向に一次元配列にします
print(y1)
# [1 2 3 4 5 6 7 8]
y2 = y.flatten('F')# 引数を'F'にすることで列方向に一次元配列にできます
print(y2)
# [1 5 2 6 3 7 4 8]

配列の結合

配列の結合もよく行う操作です。ここでは配列を縦に結合する方法と横に結合する方法について説明します。

縦に結合する

np.vstackを使うことで縦に結合できます。縦の結合の場合、列数が一致していないとエラーが出ます。

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

z = np.vstack((x, y))  # (x, y)が引数になるので二重の()が必要
print(z)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]

横に結合する

np.hstackを使うことで横に結合できます。横の結合の場合、行数が一致していないとエラーが出ます。

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

z = np.hstack((x, y))
print(z)
# [1 2 3 4 5 6]

x, yを列ベクトルにして横に結合したいときはreshape関数で変形してから結合します。

x = x.reshape(3, 1)
print(x)
# [[1]
#  [2]
#  [3]]
y = y.reshape(3, 1)
print(y)
# [[4]
#  [5]
#  [6]]

z = np.hstack((x, y))
print(z)
# [[1 4]
#  [2 5]
#  [3 6]]

その他のよく使う関数

np.append

np.appendで配列に要素を追加することができます。

x = np.array([1, 2, 3])
x = np.append(x, 4)  # ()内の第一引数に元の配列、第二引数に追加する要素を入れます
print(x)
# [1 2 3 4]

y = np.append(0, x)  # 先頭に0を追加します
print(y)
# [0 1 2 3]

np.delete

np.deleteで配列から任意の行や列を削除できます。

()内の引数は(元の配列, 削除する行列番号, 削除対象の軸)とします。削除対象の軸は行を削除したいときは0, 列を削除したいときは1とします。

x = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.delete(x, 0, 0))  # 1行目を削除します
# [[ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.delete(x, 1, 1))  # 2列目を削除します
# [[ 0  2  3]
#  [ 4  6  7]
#  [ 8 10 11]]

np.where

np.whereは条件を満たす要素を返します。

()内の引数は1つ目に条件、2つ目に条件に合う場合に返すもの、3つ目に合わない場合に返すものを入れます。

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

x = np.where(x>4, 1, 0)  # x>4の場合1, そうでない場合0を返します
print(x)
# [0 0 0 0 0 1 1 1 1]

まとめ

この記事ではNumpy配列に対する抽出、変形、結合などの基本的な操作について解説しました。Numpy配列を用いることで高速かつシンプルなコードを書くことができるので、ぜひ使いこなしてください。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL