科学・技術計算において配列は必要不可欠である。
numpyを利用して配列の基本操作を行う。
##内容
(1) 「リスト」からの配列作成
(2) 配列要素の表示・取り出し
(3) 配列の「追加」「連結」
(4) 配列要素のソート
(5) 配列の「四則演算」
(6) 配列要素への関数適用
[補遺] Python標準の「(多重)リスト」との違いについて
###(1) 「リストからの配列作成
import numpy as np
"""
「配列」の作成
"""
a_list = [0,1,2,3,4,5] # a_listという名前のリストを作成し, 要素0, 1, 2, 3, 4, 5を格納する
a_array = np.array(a_list) # a_listを「配列」にする
print(a_array)
###結果(1)
[0 1 2 3 4 5]
###(2)配列要素の取り出し
a_list = [0,1,2,3,4,5] # a_listという名前のリストを作成し, 要素0, 1, 2, 3, 4, 5を格納する
a_array = np.array(a_list) # a_listを「配列」にする
print(a_array[0]) #配列の要素ゼロ番を表示 (ゼロから数える) # A
print(a_array[1]) # ** 1番 #B
print(a_array[-1]) #後ろから数える。後ろから-1, -2, ...という順番になっている。 #C
print(a_array[1:3]) # 要素番号1(ゼロから数えるので左から2番目の要素)か3番目の配列要素までの配列を作成 #D
print(a_array[2:]) # 要素番号2(ゼロから数えるので左から3番目の要素)から最後の要素の一つ前までを含む配列を作成 #D
print(a_array[:4]) # 要素番号0から4番目の配列要素までを含む配列を作成 #F
###結果(2)
0 #A
1 #B
5 #C
[1 2] #D
[2 3 4 5] #E
[0 1 2 3] EF
(注) 後ろのアルファベットは,上のコード中のprint関数の出力の行にあるアルファベットに対応している。
###(3) 配列の「追加」「連結」
np.append(配列, 要素)をとする。
import numpy as np
a_list = [0,1,2,3,4,5] # a_listという名前のリストを作成し, 要素0, 1, 2, 3, 4, 5を格納する
a_array = np.array(a_list) # a_listを「配列」にする
a_array = np.append(a_array,10) # 要素'10'を配列a_arrayに追加する
print(a_array)
###結果(3-1)
[ 0 1 2 3 4 5 10]
import numpy as np
a_list = [0,1,2,3,4,5] # a_listという名前のリストを作成し, 要素0, 1, 2, 3, 4, 5を格納する
a_array = np.array(a_list) # a_listを「配列」a_arrayにする
b_list=[200, 300, 400] #b_listという名前のリストを作成し, 要素 200, 300, 400を格納する
b_array = np.array(b_list) # b_listを「配列」b_arryaにする
a_array = np.append(a_array, b_array) ## 配列a_arrayに配列b_arrayを連結する
print(a_array)
###結果(3-2)
[ 0 1 2 3 4 5 200 300 400]
###(4)配列要素のソート
sortを使うと配列要素を小さい数値から大きい数値へと順番に並んだ(昇順)配列が得られる。sortedとreverseオプションを使うとsortとは逆(降順)に並べ変える。
import numpy as np
c_list = [14, 90, 4, 23, 61, 110, 75]
c_array = np.array(c_list)
sorted1=np.sort(c_array) # 配列c_arrayを昇順にならべた配列をsorted1という名で構築する
sorted2=np.array(sorted(c_array, reverse=True)) # 配列c_arrayを降順に並べた配列をsorted2という名で構築する
print(sorted1)
print(sorted2)
###結果(4)
[ 4 14 23 61 75 90 110]
[110 90 75 61 23 14 4]
###(5)配列の「四則演算」
import numpy as np
"""
配列の「四則演算」
"""
D1_array=np.array([1, 2, 3])
D2_array=np.array([4, 5, 6])
print(D1_array+D2_array) # 加算 = numpy.add(D1_array, D2_array) #A
print(D1_array-D2_array) # 減算 = numpy.subtract(D1_array, D2_array)#B
print(D1_array*D2_array) # 乗算 = numpy.multiply(D1_array, D2_array) #C
print(D1_array/D2_array) # 除算 = numpy.divide(D1_array, D2_array) #D
print(D1_array%D2_array) #剰余 = numpy.add(D1_array, D2_array) #E
print(D1_array**D2_array) # べき乗 numpy.power(D1_array, D2_array) #F
###結果(5):
[5 7 9] #A
[-3 -3 -3] #B
[ 4 10 18] #C
[ 0.25 0.4 0.5 ] #D
[1 2 3] #E
[ 1 32 729] #F
(注)リストの後ろのアルファベットは,上のコード中のprint関数の出力の行にあるアルファベットに対応している。
###(6) 配列要素への関数適用
import numpy as np
"""
配列要素への同じ関数の適用
"""
D_array=np.array([1, 2, 3]) # 要素 1, 2, 3をもった配列D_arrayを構築
print(np.cos(D_array)) # D_arrayの全ての要素を引数としてcos関数値を評価する
print(np.sqrt(D_array)) # D_arrayの全ての要素を引数としてsqrt関数(ルート)値を評価する
###結果(6)
[ 0.54030231 -0.41614684 -0.9899925 ]
[ 1. 1.41421356 1.73205081]
###補遺: Python標準の「(多重)リスト」とnumpyのndarrayの違いについて
numpy.array(リスト)で作られるndarrayというオブジェクトをpythonによるリストオブジェクトと比較すると次のような特徴がある(文献[1])。1と2により計算処理の高速化が可能となる。演算時のオーバーヘッド(メモリアクセス・関数コールにかかる時間)が減少するため。詳しくは文献[1]を参照。
- メモリの連続領域にデータが保存される(C言語やFortranの配列と同様)
- 基本的に同じ型構造を持つ要素で構築される
- 各次元毎の要素数が等しくなければならない
- 配列中の(全)要素に対して特定の演算を高速に実行できる
##参考文献
[1] 中久喜健司著「科学技術計算のためのPython入門」, 技術評論社, 2016.