Pythonの基礎2 配列編

例えば,サンプリング1Hz(1秒に1回データが計測できる)のセンサが3個ついたロボットを考えてみましょう.
このロボットは,5秒間動作すると,5×3個のデータが記録されることになります.こういったデータの塊を入れることができる変数を配列といいます.
例えば,以下のような配列があったとします.

時間 センサ1 センサ2 センサ3
1 0 0.2 0.1
2 0.2 0.4 0.3
3 0.4 0.8 0.5
4 0.6 0.4 0.7
5 0.8 0.2 0.9

配列の大きさを調べる

最初に出てくる「numpy」とは数値計算ライブラリで,ベクトルや行列などのデータを簡単に取り扱うことができます.

In [5]:
import numpy as np
data = np.array([[1,0,0.2,0.1],[2,0.2,0.4,0.3],[3,0.4,0.8,0.5],[4,0.6,0.4,0.7],[5,0.8,0.2,0.9]])

print(data)
row,col = data.shape
print("行数 " + str(row))#行
print("列数 " + str(col))#列
[[1.  0.  0.2 0.1]
 [2.  0.2 0.4 0.3]
 [3.  0.4 0.8 0.5]
 [4.  0.6 0.4 0.7]
 [5.  0.8 0.2 0.9]]
行数 5
列数 4

1.特定のデータを取り出す方法

何例か特定の部分のデータを取り出す方法を紹介します.注意しないといけないのは,行も列も0番から数えるのということです.

In [37]:
import numpy as np
data = np.array([[1,0,0.2,0.1],[2,0.2,0.4,0.3],[3,0.4,0.8,0.5],[4,0.6,0.4,0.7],[5,0.8,0.2,0.9]])

## 1列目を取り出したい場合
print("1列目のデータ")
x1 = data[:,0] #0番から数えるので注意!
print(x1)

# 2行目を取り出したい場合
print("2行目のデータ")
x2 = data[1,:] #0番から数えるので,2行目は「1」と表記する.
print(x2)

# 2行・3列目のデータを取り出す場合(つまり2秒のときのセンサ2の値を取り出すとき)
print("2行・3列目のデータ")
x3 = data[1,2]
print(x3)

# 2列目から最後までを取り出す場合
print("2列目から最後までのデータ")
x4 = data[:,1::] #最初の「:」はすべての行という意味.「1::」は2列目から最後までという意味
print(x4)

# 2行目~4行目を取り出す場合
print("2行目から4行目のデータ")
x5 = data[1:4,:]
print(x5)
1列目のデータ
[1. 2. 3. 4. 5.]
2行目のデータ
[2.  0.2 0.4 0.3]
2行・3列目のデータ
0.4
2列目から最後までのデータ
[[0.  0.2 0.1]
 [0.2 0.4 0.3]
 [0.4 0.8 0.5]
 [0.6 0.4 0.7]
 [0.8 0.2 0.9]]
2行目から4行目のデータ
[[2.  0.2 0.4 0.3]
 [3.  0.4 0.8 0.5]
 [4.  0.6 0.4 0.7]]

2 配列の計算

In [43]:
import numpy as np
data = np.array([[1,0,0.2,0.1],[2,0.2,0.4,0.3],[3,0.4,0.8,0.5],[4,0.6,0.4,0.7],[5,0.8,0.2,0.9]])

# 配列通しの足し算
print("3秒のときのデータと4秒の時のデータを足し合わせた結果")
x1 = data[2,:] #3秒の時のデータ
x2 = data[3,:] #4秒の時のデータ
print(x1 + x2) #足し合わせた結果

#3列目のすべての要素に1を加える
print("3秒のときのデータのすべての要素に1を加えた結果")
a = np.ones((1,4)) ##onesは要素がすべて1の配列を作るということ.この場合は1行4列の大きさですべての要素が1の配列を作る.
print(x1 + a)

# 3列目のすべての要素を2倍にする
print("3秒のときのデータをすべて2倍にした結果")
print(2*x1) #普通の数字の場合と同じ.

# 新しい行を追加する
print("データに新しい行を加えた結果")
b =  np.array([6,6,6,6])
new_data = np.vstack([data,b]) ##vstackとhstackがある.配列を縦に追加するのがvstack,横に追加するのがhstack.
print(new_data)
3秒のときのデータと4秒の時のデータを足し合わせた結果
[7.  1.  1.2 1.2]
3秒のときのデータのすべての要素に1を加えた結果
[[4.  1.4 1.8 1.5]]
3秒のときのデータをすべて2倍にした結果
[6.  0.8 1.6 1. ]
データに新しい行を加えた結果
[[1.  0.  0.2 0.1]
 [2.  0.2 0.4 0.3]
 [3.  0.4 0.8 0.5]
 [4.  0.6 0.4 0.7]
 [5.  0.8 0.2 0.9]
 [6.  6.  6.  6. ]]

3. 平均値,標準偏差,最大値,最小値を求める.

平均、標準偏差、最大値、最小値については,第 1 引数 に 0 または 1 を指定する。0 ならば 1 次元方向に、1 ならば 2 次元方向に演算を行う。

In [47]:
import numpy as np
data = np.array([[1,0,0.2,0.1],[2,0.2,0.4,0.3],[3,0.4,0.8,0.5],[4,0.6,0.4,0.7],[5,0.8,0.2,0.9]])

#各列の平均値を求める
mean_data = data.mean(0)
print(mean_data)

#1列だけの場合は、その列の平均値
mean_data2 = data[:,2].mean(0)
print(mean_data2)

#各要素の標準偏差を求める
std_data = data.std(0)
print(std_data)

#1列だけの場合は、その列の標準偏差
std_data2 = data[:,2].std(0)
print(std_data2)

max_data1 = data.max(0)#列方向で最大値を求める
print(max_data1) 

max_data2 = data.max(1)#行方向で最大値を求める
print(max_data2)

min_data1 = data.min(0)#列方向で最小値を求める
print(min_data1) 

min_data2 = data.min(1)#行方向で最小値を求める
print(min_data2)
[3.  0.4 0.4 0.5]
0.4000000000000001
[1.41421356 0.28284271 0.21908902 0.28284271]
0.21908902300206645
[5.  0.8 0.8 0.9]
[1. 2. 3. 4. 5.]
[1.  0.  0.2 0.1]
[0.  0.2 0.4 0.4 0.2]

4. データの保存と読み込み

4.1 保存

ロボットを動作させたときの各センサの計測値を保存したい場合は,以下のように書きます.

In [ ]:
import numpy as np
np.savetxt('result.csv',outTable,delimiter=',')#「result.csv」という名前でoutTableというデータを保存する

4.2読み込み

同じフォルダ内の「A.csv」というファイルを読み込ませたい場合は,以下のように書けばOK.

In [ ]:
import numpy as np
data = np.loadtxt("A.csv", delimiter=',')
print(data)

読み込ませたいファイルがpythonのプログラムとは違う階層にある場合は,以下のように指定して書く.

In [ ]:
import numpy as np
data = np.loadtxt("C://Users\XXXXX//Desktop//A.csv", delimiter=',')
print(data)