# 科学計算モジュール Numpy
import numpy as np
import numpy.random as random
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
%precision 3
# Numpy
ar = np.arange(10)
ar
ar_slice = ar[0:4]
ar_slice
ar_slice[0] = 100
"""
スライスは元のリストの一部分を取り出して見ている。
スイスしたリストを変更すると元リストも変更される。
"""
ar
ar = np.arange(10)
# copy()メソド
ar_copy = ar[0:4].copy()
# または np.copy() 関数
ar_copy = np.copy(ar[0:4])
ar_copy # array([0, 1, 2, 3])
ar_copy[0] = 100
ar # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
"""
完全に複製したい場合はcopy()メソドまたは
np.copy() 関数を使用すること
"""
# boolインデックス
# サンプルデータを生成する
abc = np.array(['a', 'b', 'c', 'd', 'a'])
np.random.seed(0)
data = np.random.randn(5, 5)
print(abc)
print(data)
"""
['a' 'b' 'c' 'd' 'a']
[[ 1.764 0.4 0.979 2.241 1.868]
[-0.977 0.95 -0.151 -0.103 0.411]
[ 0.144 1.454 0.761 0.122 0.444]
[ 0.334 1.494 -0.205 0.313 -0.854]
[-2.553 0.654 0.864 -0.742 2.27 ]]
"""
# 'a' の列だけ取り出す:ブールインデックス参照という
abc == 'a' # array([ True, False, False, False, True])
data[abc == 'a']
'''
array([[ 1.764, 0.4 , 0.979, 2.241, 1.868],
[-2.553, 0.654, 0.864, -0.742, 2.27 ]])
'''
# 条件制御
# ブールインデックスを生成する
bool_index = np.array([True, True, False, False, True])
# サンプルデータを生成する
x_array = np.array([1, 2, 3, 4, 5])
y_array = np.array([11, 22, 33, 44, 55])
# 条件制御 np.where(ブールインデックス, True対象, False対象)
np.where(bool_index, x_array, y_array)
"""
Trueならx_aray , Falseならy_arrayを使用する
array([ 1, 2, 33, 44, 5])
"""
#練習
keys = np.array(['a','b','c','d','a'])
np.random.seed(0)
data = np.random.randn(5,5)
print(data)
"""
[[ 1.764 0.4 0.979 2.241 1.868]
[-0.977 0.95 -0.151 -0.103 0.411]
[ 0.144 1.454 0.761 0.122 0.444]
[ 0.334 1.494 -0.205 0.313 -0.854]
[-2.553 0.654 0.864 -0.742 2.27 ]]
"""
#bを抜き出す
bool_index = keys == 'b' # array([False, True, False, False, False])
data[bool_index]
#練習
#cを抜き出す
bool_index = keys == 'c'
data[bool_index]
#array([[0.144, 1.454, 0.761, 0.122, 0.444]])
#練習
a_array = np.array([1,2,3,4,5])
b_array = np.array([7,8,9,10,11])
np.where([False, False, True, True, False], a_array, b_array)
# Numpy の 演算処理
#重複を削除する np.unique()
bool_index =[True, False, False, True]
np.unique(bool_index) #array([False, True])
# ユニバーサル関数 リストの要素全てにかけられる関数
data = [1,2,3,4,5]
print(np.exp(data)) # [ 2.718 7.389 20.086 54.598 148.413]
print(np.sqrt(data))# [1. 1.414 1.732 2. 2.236]
print(np.log2(data))# [0. 1. 1.585 2. 2.322]
print(np.sin(data)) # [ 0.841 0.909 0.141 -0.757 -0.959]
# 最大 最小 平均 合計
data = np.arange(12).reshape(3,4)
data
"""
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
np.max(data) # 11
np.max(data, axis=0) # array([ 8, 9, 10, 11])
np.max(data, axis=1) # array([ 3, 7, 11])
np.min(data)
np.min(data, axis=0)
np.min(data, axis=1)
np.mean(data)
np.mean(data, axis=0)
np.mean(data, axis=1) # array([1.5, 5.5, 9.5])
np.mean(data) # 5.500
np.mean(data, axis=0)# array([4., 5., 6., 7.])
np.mean(data, axis=1) # array([1.5, 5.5, 9.5])
# True-False値の判定 np.any() , np.all()
bool_index =[True, False, False, True]
# 一つでもTrueがあったらTrue
np.any(bool_index) # True
# 全てTrueならTrue
np.all(bool_index) # False
# 5以上の大きい数がいくつあるかカウントする
data = np.arange(12).reshape(3, 4)
print(data)
print(data >= 5)
print((data >= 5).sum())
# 対角成分の抽出と和
data = np.arange(16).reshape(4, 4)
print(data)
np.diag(data) # array([ 0, 5, 10, 15])
np.trace(data) # 30
np.sum(np.diag(data)) # 30
np.sum(np.diag(data))
# 練習
data = np.arange(16).reshape(4, 4)
print(data)
# sqrt
print(np.sqrt(data))
# max min sum mean
print(np.max(data))
print(np.min(data))
print(np.sum(data))
print(np.mean(data))
# 対角成分の和
print(np.trace(data))
# 配列操作とブロードキャスト
# 再形成(行列の次元を変更する
data = np.arange(10)
print(data)
print(data.reshape(2, 5))
print(data.reshape(5, 2))
# データの結合 concatenate
data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[6,7,8],[9,10,11]])
# リストで渡す必要がある
print(np.concatenate([data1, data2]))
"""
[[ 1 2 3]
[ 4 5 6]
[ 6 7 8]
[ 9 10 11]]
"""
print(np.concatenate([data1, data2], axis=0))
print(np.vstack([data1, data2]))
"""
[[ 1 2 3]
[ 4 5 6]
[ 6 7 8]
[ 9 10 11]]
"""
print(np.concatenate([data1, data2], axis=1))
print(np.hstack([data1, data2]))
"""
[[ 1 2 3 6 7 8]
[ 4 5 6 9 10 11]]
"""
# 配列の分割 split
data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[6,7,8],[9,10,11]])
# 一旦結合する concatetene
data3 = np.vstack([data1, data2])
"""
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 6, 7, 8],
[ 9, 10, 11]])
"""
# split 1の手前まで, 1-3の手前まで, 3以降
first, second, third = np.split(data3, [1,3])
print(first) #1の手前まで
print(second) #1-3の手前まで
print(third) #3以降
"""
[[1 2 3]]
[[4 5 6]
[6 7 8]]
[[ 9 10 11]]
"""
# 配列の分割 split
np.random.seed(0)
data = np.random.randint(0, 10, 21).reshape(7, 3)
print(data)
"""
[[5 0 3]
[3 7 9]
[3 5 2]
[4 7 6]
[8 8 1]
[6 7 7]
[8 1 5]]
"""
# 分割 split
first, second, third, forth = np.split(data, [2,3,5])
print(first)
print(second)
print(third)
print(forth)
"""
[[5 0 3]
[3 7 9]]
[[3 5 2]]
[[4 7 6]
[8 8 1]]
[[6 7 7]
[8 1 5]]
"""
print(first[0]) # [5 0 3]
print(first[1]) # [3 7 9]
# 繰り返し生成 repeat
data = [1, 2, 3]
np.repeat(a=data, repeats=5)
"""
array([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3])
"""
# ブロードキャスト
data = np.arange(10)
print(data) # [0 1 2 3 4 5 6 7 8 9]
print(data + 3)
"""
型が違っていてもnp.arrayは内部で一旦コピーして形を揃えてから演算してくれている。
[ 3 4 5 6 7 8 9 10 11 12]
"""
# 練習
# 縦に結合
data1 = np.arange(12).reshape(3, 4)
data2 = np.arange(12).reshape(3, 4)
data3 = np.vstack([data1, data2])
print(data3)
# 横に結合
data4 = np.hstack([data1, data2])
print(data4)
# 練習 pythonリストの要素に3を加える
li = [1, 2, 3, 4, 5]
np_ar = np.array(li)
# ブロードキャストを使用する
np_ar + 3
"""
array([4, 5, 6, 7, 8])
"""