NumPy2 shape/データ読込/四則演算 他
NumPyの第2回目となります。
Aidemyさんの講座を受講しながらアウトプットのためにブログを更新しております。
AidemyさんHP → https:// aidemy.net
【shape】
shapeは配列の形状を確認する事ができるインデックス変数です。
似たようなものとして、reshapeがありますが、それは配列の形状変更ができます。
import numpy as np
list_1 = [[1, 2], [3, 4], [5, 6]]
arr_1 = np.array(list_1)
print(arr_1.shape)
print(arr_1)
>>> 出力結果
(3, 2) #listが3行、2列でできていることを示す
[[1 2]
[3 4]
[5 6]]
list_2 = [1, 2, 3, 4, 5, 6]
arr_2 = np.array(list_2)
print(arr_2.shape)
>>> 出力結果
(6,) #listが6行、0列でできていることを示す
【データの読み込み】
numpy.loadtxt()関数を用いて、既存のデータからNumPy配列を作成できます。
構造理解として
delimiter :区切り文字(デリミタ)を指定
dtype :データ型を指定:
skiprows, usecols:読み込む行・列を指定
import numpy as np
arr_1 = np.loadtxt("./4002_new_numpy/csv_example.csv",
delimiter=",", # 区切り文字をカンマに指定
skiprows=1, # 最初の1行をスキップ
usecols=[0, 1, 2]) # 使用する列番号を指定
print(arr_1)
>>> 出力結果
[[ 1. 167. 54.]
[ 2. 180. 86.]
[ 3. 151. 68.]
[ 4. 174. 63.]]
引数usecolsで指定する列番号は、ゼロオリジンで数えます。
<データ取得2>
前のデータよりも大きいもので行います。
数値データは5行目以降に格納されているため、読み込む際には1行目から5行目を除外します。一番左の列には日付が格納されており、数値データではないため、この列は読み込んではいけません。
import numpy as np
with open("./4002_new_numpy/weather_tokyo.csv", encoding="shift_jis") as f_in:
arr_1 = np.loadtxt(f_in,
delimiter=",", # 区切り文字をカンマに指定
skiprows=5, # 最初の5行をスキップ
usecols=[1,2,3,4]) # 使用する列番号(0列目を除外)を指定
print(arr_1)
>>> 出力結果
[[ 6.2 0. 1. 2.7]
[ 6.1 0. 1. 3.2]
[ 4.9 0. 1. 5.2]
...,
[ 4.8 0. 1. 3.9]
[ 4.9 0. 1. 2.8]
[ 5.3 0. 1. 2.3]]
【NumPyの四則演算】
2次元のNumPy配列arr_1の要素すべてに5を足したarr_2を計算
import numpy as np
arr_1 = np.array([[1, 2], [3, 4]]) #配列作成
arr_2 = arr_1 + 5 #arr_1の要素に全て5を足す
print(arr_1)
print(arr_2)
>>> 出力結果
[[1 2]
[3 4]]
[[6 7] #[[1, 2], [3, 4]]にそれぞれ+5
[8 9]]
補足として、「ブロードキャスト」と言って、演算を行う前にNumPy配列のshapeを合わせることで、それぞれの位置に該当する数値同士をかけることができます。
import numpy as np
arr_1 = np.array([[1, 2], [3, 4]]) #配列作成
arr_3 = arr_1 * np.array([[5, 5], [5, 5]])
print(arr_3)
>>> 出力結果
[[ 5 10] #1*5 / 2*5 / 3*5 / 4*5
[15 20]]
<特定の行・列に対する四則演算>
import numpy as np
with open("./4002_new_numpy/weather_tokyo.csv", encoding="shift_jis") as f_in:
arr_1 = np.loadtxt(f_in,
delimiter=",", # 区切り文字をカンマに指定
skiprows=5, # 最初の5行をスキップ
usecols=[1, 2, 3, 4]) # 使用する列番号を指定
arr_2 = arr_1 * np.array([1.8, 1, 1, 1]) + np.array([32, 0, 0, 0])
print(arr_2)
>>> 出力結果
[[ 43.16 0. 1. 2.7 ]
[ 42.98 0. 1. 3.2 ]
[ 40.82 0. 1. 5.2 ]
...,
[ 40.64 0. 1. 3.9 ]
[ 40.82 0. 1. 2.8 ]
[ 41.54 0. 1. 2.3 ]]
【NumPyの要素抽出】
NumPy配列では、Python標準のリストと同様にインデックス番号を指定することで、要素の抽出ができます。
import numpy as np
arr_1 = np.array([0,1,2,3,4,5])
num = arr_1[2] # 2番目の要素を抽出
arr_2 = arr_1[1:4] # 1番目の要素から3番目の要素までを抽出
print(num)
print(arr_2)
>>> 出力結果
2
[1 2 3]
[start:stop:step]を使ってスライス指定を行います。
start : 始点 / stop :終点 / step:いくつの要素ごとにみるか
[0:10:2]の場合、「0〜10までを一つ飛ばしを指定
import numpy as np
# arr_1を作成
arr_1 = np.array([1,2,3,4,5,6,7,8,9,10])
ans1 =arr_1[6] #0から数えて7は6番目にある
print('1.')
print(ans1)
ans2 =arr_1[0:10:2] #スライスの指定方法は[start:stop:step]、1つ飛ばしは2を指定
print('2.')
print(ans2)
>>> 出力結果
1.
7 #ans1
2.
[1 3 5 7 9] #ans2
<リストではできない抽出>
#インデックスを指定して、以下のNumPy配列arr_1から7を抽出し、ansに代入しましょう
import numpy as np
# arr_1を作成します
list_1 = [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]
arr_1 = np.array(list_1)
# インデックスを指定して、arr_1から7を抽出し、ansに代入しましょう
ans =arr_1[1,0,0] #①1〜6と7〜12のグループ ②7〜8、9〜10、11〜12のグループ ③7と8
#[ ]にはグループの中で7はどの位置にいるのか明示していく
print(ans)
>>> 出力結果
7
<複数要素の抽出>
NumPy配列のインデックスをリストで記述することで、複数要素の抽出が可能です。
import numpy as np
list_1 = [[1,2],[3,4],[5,6]]
arr_1 = np.array(list_1)
# リストにより複数要素を抽出
print(arr_1[[2, 1]]) #2の要素を抽出→[5,6] 1の要素を抽出→[3,4]
>>> 出力結果
[[5 6]
[3 4]]
インデックスを記述する角括弧[]とリストを記述する角括弧[]の、役割の違いは確認しましょう。
*[[ ]]:リストを記述 / [ ]:インデックスを記述
import numpy as np
list_1 = [[1,2],[3,4],[5,6]]
arr_1 = np.array(list_1)
print(arr_1[2, 1]) #上記コードとは[[ ]]と[ ]の違い
>>> 出力結果
6
今回は以上とさせていただきます。
お読みいただきありがとうございました。