【要点だけつかんでください】C言語プログラマのためのPython学習②

開発のTips

今回もプログラミングに関する記事です.前回の続いて,C言語プログラマのためのPython学習についてです.
前回変数,for文,if文について書きました.
今回はリストの操作について書いていこうと思います.また,行列計算を可能にするnumpyのndarrayについても紹介します.

リストの操作

リストとは,C言語で言うところの配列に相当します.Pythonでは多次元リストを簡単に扱うことができ,画像処理におけるピクセルやチャンネルが比較的簡単に操作できます.
まずは配列(リスト)を作り,中身を表示する例を紹介します.

C言語

#include <stdio.h>
int main(void){
	int int_array[5] = {1, 2, 3, 4, 5};
	char ch_array[] = {"Hello"};
	for(int i = 0; i<5; i++)
	{
		printf("%d\n", int_array[i]);
	}
	for(int j = 0; j<=5; j++)
	{
		printf("%c\n", ch_array[j]);
	}
}

>>1
>>2
>>・・・
>>H
>>e
>>・・・
>>o

Cでの配列の書き方は様々ですね.とりあえず代表的なものを書いておきました.ただ,普段Pythonを使っている者からすると,とても煩わしい手続きに思えてしまいます(実際,この記事を書きながら何て煩わしく,面倒なんだと思ってしまった...).

Python

int_array = [1, 2, 3, 4, 5]
ch_array = ["H", "e", "l", "l", "o"] # もしくはch_array = list("Hello")
for i in range(len(int_array)):# len("リスト名")はリストのサイズを表す.つまり,リストの最初から最後までループを回すということを表す.
	print(int_array[i])
for j in range(len(ch_array)):
	print(ch_array[j])
>>1
>>2
>>・・・
>>H
>>e
>>・・・
>>o

Cの配列とPythonのリストを比較してみて初めて思いましたが,Pythonのリストの使い勝手が良いなと思いました.
ここまでで,比較してわかることは“リストを定義する際に大きさを決めなくてよい”“型を定義しなくてよい”ということです.比較してわかることはこのぐらいのことしかありません.これだけではリストの使い方としては1割も理解していないと思いますので,続いてその他の便利な操作について紹介します.

リストへの値の追加

リストは定義時にサイズを決めませんでした.そのリストに値をいくつでも追加することができます.

int_array = [] # 空リストもつくれる
ch_array = list("Hello") # ["H", "e", "l", "l", "o"]と格納されるリストをつくる
for i in range(10):
	int_array.append(i) # "リスト名".append()でリストに要素を追加する
print(int_array)
print(ch_array)

new_array = int_array + ch_array # リスト+リストで連結することができる
print(new_array)

>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>['H', 'e', 'l', 'l', 'o']
>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'H', 'e', 'l', 'l', 'o']

この例では,空リストを定義して0から9までの整数を追加しました.また,文字が格納されているリストと“+”を使ってリストを連結し新しいリストをつくりました.型定義が必要ないということで,整数と文字列を同じリスト内に格納することができます.C言語と比較して直観的な操作が可能です.

スライスによるリストの操作

スライスという表記によって,必要な要素だけ指定することができます.

int_array = []
for i in range(100):
	int_array.append(i)
print(int_array)
print(int_array[:])
print(int_array[24:52])
print(int_array[:52])
print(int_array[24:])
print(int_array[24:-1])
print(int_array[0:10:2])	

>>[0, 1, ・・・, 98, 99]    リスト名→全ての要素
>>[0, 1, ・・・, 98, 99]    [:]  →全ての要素
>>[24, 25, ・・・, 50, 51]  [a:b]→要素aから要素bまでの全て
>>[0, 1, ・・・, 50, 51]    [:b] →最初の要素から要素bまでの全て
>>[24, 25, ・・・, 98, 99]  [a:] →要素aから最後の要素まで
>>[24, 25, ・・・, 98, 99]  [a:-1]→要素aから最後の要素まで
>>[0, 2, 4, 6, 8]        [a:b:c]→要素aから要素bまでcのステップで

“:(スライス)”を使うことでリストの中から必要な要素だけ取得してくることができます.スライスを駆使して短い行で必要な要素だけ取得するようにしましょう.

多次元リスト

多次元リスト(リストのリスト)を定義することができます.

list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(list)
print(list[0])
print(list[1][0])
print(list[2][1][0])

>>[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>[1, 2, 3]
>>4

これまでのリストの操作の延長線上として考えられます.要素が数字や文字からリストになっただけで,特別な操作の違いははありません.

行列計算

ここではnumpyというモジュールを使って,行列計算をできるようにします.リストに似ていますが,ndarrayという型の変数を扱います.

import numpy as np
array = np.array([1,2,3])
print(array)

mul_array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mul_array2 = np.array([[10, 11, 12], [13, 14, 15], [16, 17, 18]])
print(mul_array1)

new_array1 = 3 * mul_array1
print(new_array1)
print(new_array1[2][1])

new_array2 = mul_array1 * mul_array2
print(new_array2)

new_array3 = mul_array1 @ mul_array2
print(new_array3)

print(array.shape)
print(mul_array1.shape)

>>[1 2 3]
>>[[1 2 3]
   [4 5 6]
   [7 8 9]]
>>[[ 3  6  9]
   [12 15 18]
   [21 24 27]]
>>24
>>[[ 10  22  36]
   [ 52  70  90]
   [112 136 162]]
>>[[ 84  90  96]
   [201 216 231]
   [318 342 366]]
>>(3,)
>>(3, 3)

リストに似ていますが,定義の仕方や要素取得の仕方が若干異なります.
ndarrayは行列としての計算が可能です.new_array1はそれぞれの要素に3を掛けています.new_array2は“*”を使って行列の要素ごとの掛け算を表し,new_array3は“@”を使って行列の掛け算を表しています.
また,行列計算では計算不可能な行列どうしの足し算や掛け算は許されていません.そのため,エラーが出た時には“ndarray名”.shapeで行列の形を表示させてみましょう.例えば上の例のnew_array1.shape→(3, 3)というのは3×3行列を表しています.

最後に...

リストを有効に使うことで,様々な操作が可能になります.また,numpyで定義できるndarray型の行列は画像処理や機械学習の分野でよく使われていますので,教科書や他のWebページを参考にしながら,使い慣れていってください.

次回は関数の定義について紹介します.

コメント

タイトルとURLをコピーしました