Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

科学・技術計算において配列は必要不可欠である。
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)配列要素の取り出し

(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(配列, 要素)をとする。

例題(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]

例題(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とは逆(降順)に並べ変える。

(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)配列の「四則演算」

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

例(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]を参照。

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

参考文献

[1] 中久喜健司著「科学技術計算のためのPython入門」, 技術評論社, 2016.

sci_Haru
初歩的なことしかできません。。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away