[Pythonによる科学・技術計算] 配列の基本操作, numpy

科学・技術計算において配列は必要不可欠である。
numpyを利用して配列の基本操作を行う。

##内容
(1) 「リスト」からの配列作成
(2) 配列要素の表示・取り出し
(3) 配列の「追加」「連結」
(4) 配列要素のソート
(5) 配列の「四則演算」
(6) 配列要素への関数適用
[補遺] Python標準の「(多重)リスト」との違いについて
***


###(1) 「リストからの配列作成

```py3
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)配列要素の取り出し
```py3:(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(配列， 要素)をとする。

```py3:例題(3-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を「配列」にする

a_array = np.append(a_array,10) # 要素'10'を配列a_arrayに追加する
print(a_array)
```
###結果(3-1)


[ 0  1  2  3  4  5 **10**]




```py3:例題(3-2)配列の連結
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とは逆(降順)に並べ変える。


```py3:(4)ソート
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)配列の「四則演算」

```py3
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) 配列要素への関数適用

```py3:例(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という[オブジェクト](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))をpythonによるリストオブジェクトと比較すると次のような特徴がある(文献[1])。1と2により計算処理の高速化が可能となる。演算時のオーバーヘッド(メモリアクセス・関数コールにかかる時間)が減少するため。詳しくは文献[1]を参照。


1. メモリの連続領域にデータが保存される(C言語やFortranの配列と同様)
2. 基本的に同じ型構造を持つ要素で構築される
3. 各次元毎の要素数が等しくなければならない
4. 配列中の(全)要素に対して特定の演算を高速に実行できる

***
##参考文献
[1] 中久喜健司著「[科学技術計算のためのPython入門](http://gihyo.jp/book/2016/978-4-7741-8388-6)」, 技術評論社, 2016.