【超高速Python入門】第3回:配列型を知ろう(list, numpy)

Pythonの配列について説明します。

配列とは

配列を使うとデータをまとめて保持したり、処理することができます。Pythonでは、list型やNumpy、Pandasが主に使用されます。ここでは、list型とNumpyについて説明します。

【Udemy】データ分析シリーズ? -Pythonライブラリの実践活用-

list型

list型は組み込み関数のためimportする必要はありません。異なるデータ型でもまとめて格納することができます。

定義・初期化

空リストの作成は[ ]でOKです。要素をカンマ区切りで書けば、要素を格納できます。

リスト変数 = []

リスト変数 = [要素1, 要素2, 要素3,...]

要素を指定して定義する場合は、[ ]に格納したい値を指定するだけです。データ型が違ってもOKです。(サンプルコード参照)

## Sample
# int型
list_a = [ 1 , 2 , 3 ]

#文字型
list_b = [ "A" , "B" , "C" ]

# 二次元配列
list_c = [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ]

# 異なるデータ型
list_d = [ 1 , "B" , 3.2 ]
【Udemy】現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

要素指定

配列のインデックスは0から始まり、配列の長さ-1まで指定できます。-1を指定すると、最後の要素を指定したことになり、配列の長さ-1と同じ指定になります。また:(コロン)を使って範囲を指定することもできます。

# 整数でindexを指定
リスト[index]

# 末尾は-1を指定
リスト[-1]

# 範囲指定
リスト[開始位置:終了位置]
## Sample
list_a = [ 1 , 2 , 3 , 4 , 5 , 6 ]

print(list_a[2])
# 出力
# 3

print(list_a[-1])
# 出力
# 6

print(list_a[1:4])
# 出力
# [2, 3, 4]

追加

appendメソッドで要素の追加が可能です。末尾に追加されます。

リスト.append(要素)
## Sample
list_a = [ 1 , 2 , 3 ]

list_a.append(4)
print(list_a)
# 出力
# [1, 2, 3, 4]

その他

そのほか、筆者がよく使うものを記載します。もっと詳しく知りたい場合は公式ドキュメントを確認してください。

# 要素数取得
len(リスト)

# 結合
リスト1 + リスト2
## Sample
list_a = [ 1 , 2 , 3 ]
list_b = [ "A" , "B" , "C" ]

### 要素数取得
print(len(list_a))
# 出力
# 3

### 結合
print(list_a + list_b)
# 出力
# [ 1 , 2 , 3 , "A" , "B" , "C" ]

Numpy

Numpyは、importして使用します。別名としてよく「np」が使われるのでここでも「np」を使います。

import numpy as np

list型と異なり、一つの配列に同じデータ型しか格納することができません。ただし、行列計算などの数値計算が容易にできます。

定義・初期化

要素数0の配列を定義する場合は、listと同様に要素は何も書きません。「[ ]」の部分は、前節で説明した空のlist型です。直接要素を指定してもよいし、リスト型の変数を作成してからその変数を指定してもよいです。

変数 = np.array([])

変数 = np.array(リスト)

listのように整数型と文字型を混在させることはできません。混在させても全て文字型として格納されてしまいます。(以下参照)

## Sample
import numpy as np

list_a = [ 1 , 2 , 3 ]

np_a = np.array([ 1 , 2 , 3 ])
np_b = np.array(list_a)

print(np_a)
print(np_b)

# 出力
# [1, 2, 3]
# [1, 2, 3]

## 文字列と数値が混在する場合は、文字型となる
np_c = np.array([ 1 , "A", 3 ])
print(np_c)
print(np_c.dtype) # .dtypeで要素のデータ型を確認できる

# 出力
# ['1' 'A' '3']
# <U21

また指定のサイズで全てを0で定義する場合、np.zerosを使用して要素数を指定します。

変数 = np.zeros([ 行 , 列 ])
## Sample
import numpy as np

np_zero = np.zeros([ 2 , 3 ])

print(np_zero)

# 出力
# [[0. 0. 0.]
# [0. 0. 0.]]

【Udemy】みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】 【Google Colaboratory対応】初心者向けの人

要素指定

list同様に指定可能です。

# 整数でindexを指定
Numpy型[index]

# 末尾は-1を指定
Numpy型[-1]

# 範囲指定
Numpy型[開始位置:終了位置]
## Sample
import numpy as np
np_a = np.array([ 1 , 2 , 3 , 4 , 5 , 6 ])

print(np_a[2])
# 出力
# 3

print(np_a[-1])
# 出力
# 6

print(np_a[1:4])
# 出力
# [2, 3, 4]

追加

appendメソッドで要素を追加できます。指定した元のNumpy型自身は更新されないため注意してください。

# Numpy型1は更新されないので注意
変数 = np.append(Numpy型1, Numpy型2)

また、2次元以上の配列に対して追加をする場合、一次元になってしまうためこちらも注意が必要です。(サンプルコード参照)

# 変数は一次元配列が格納される
変数 = np.append(二次元Numpy型, 一次元Numpy型)

## Sample
import numpy as np

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

# 出力
# [1, 2, 3, 4, 5, 6]


np_a = np.array([ [ 1 , 2 , 3 ],[ 4 , 5 , 6 ] ])
np_b = np.append(np_a, [ 7 , 8 , 9 ])
print(np_b)

# 出力
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

演算

Numpyは行列の演算が得意で、以下のように書けます。(加減乗除全て共通)

# 行列同士の計算(要素数が異なるとエラー)
Numpy型1 + Numpy型2

# 行列と数値型の計算(Numpy型の全要素に加算される)
Numpy型 + 数値型

# 行列と文字型の計算(Numpy型の全要素に文字列が結合される)
Numpy型 + 文字列型

計算できない要素数・データ型であると、エラーとなるので注意してください。

## Sample
import numpy as np

### 行列同士の計算
np_a = np.array([ 1 , 2 , 3 ])
np_b = np.array([ 4 , 5 , 6 ])
print(np_a + np_b)

# 出力
# [5, 7, 9]

### 行列と数値型の計算
np_a = np.array([ 1 , 2 , 3 ])
print(np_a + 10)

# 出力
# [11, 12, 13]

### 行列と文字型の計算
np_a = np.array([ "A" , "B" , "C" ], dtype=object)
print(np_a + "X")

# 出力
# ['AX', 'BX', 'CX']

### 行列同士の計算(計算できないデータ型)
np_a = np.array([ 1 , 2 , 3 ])
np_b = np.array([ "A" , "B" , "C" ])
print(np_a + np_b)

# 出力(エラー) 
# numpy.core._exceptions.UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types (dtype('<U21'), dtype('<U21')) -> dtype('<U21')

# 行列同士の計算(計算できない要素数)
np_a = np.array([ 1 , 2 , 3 ])
np_b = np.array([ 4 , 5 ])
print(np_a + np_b)

# 出力(エラー) 
# ValueError: operands could not be broadcast together with shapes (3,) (2,) 

リサイズ

reshapeを使って、配列の形状を変更できます。指定したNumpy配列自身は更新されないので注意です。指定する行・列のうちどちらかを-1にすると、「全要素数/指定した行or列のサイズ」が自動でセットされます。例えば、行数が動的の場合、行数の指定を-1にすると対応できますね。

# Numpy変数1は更新されないので注意
変数 = np.reshape( Numpy型1 , (変更後の行数,変更後の列数) )

# 前後で行列のサイズが合わないとエラー
## Sample
import numpy as np

np_a = np.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ])
np_b = np.reshape( np_a , (5,2) )
print(np_b)

# 出力
# [[ 1  2]
# [ 3  4]
# [ 5  6]
# [ 7  8]
# [ 9 10]]


np_a = np.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ])
np_b = np_a.reshape( 5, 2 )
print(np_b)

# 出力
# [[ 1  2]
# [ 3  4]
# [ 5  6]
# [ 7  8]
# [ 9 10]]


np_a = np.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ])
np_b = np_a.reshape( 5, -1 )
print(np_b)

# 出力
# [[ 1  2]
# [ 3  4]
# [ 5  6]
# [ 7  8]
# [ 9 10]]

型変更

astypeを使って、Numpy配列のデータ型を変更できます。定義時にも指定できます。

# Numpy変数1は更新されないので注意
変数 = Numpy型1.astype(変換したいデータ型)
## Sample
import numpy as np

np_a = np.array([ 1 , 2 , 3 ])
np_b = np_a.astype(np.float64)

print(np_a)
print(np_a.dtype)
print(np_b)
print(np_b.dtype)

# 出力
# [1 2 3]
# int64
# [1. 2. 3.]
# float64

その他

そのほか、list型の説明と同様に筆者がよく使うものを記載します。もっと詳しく知りたい場合は公式ドキュメントを確認してください。

# 配列のサイズを取得(タプル型で取得)
Numpy型.shape

# 配列を一次元に変更
変数 = Numpy型.flatten()
## Sample
import numpy as np

### 配列のサイズを取得(タプル型で取得)
np_a = np.array([ [ 1 , 2 , 3 ],[ 4 , 5 , 6 ] ])
print(np_a.shape)

# 出力
# (2, 3)


### 配列を一次元に変更
np_a = np.array([ [ 1 , 2 , 3 ],[ 4 , 5 , 6 ] ])
np_a_1d = np_a.flatten()
print(np_a_1d)

# 出力
# [1 2 3 4 5 6]

以上です。次は「条件文」について学びましょう。