In [1]:
# 科学計算モジュール Numpy
In [1]:
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
Out[1]:
'%.3f'
In [2]:
# Numpy

ar = np.arange(10)
ar
Out[2]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [3]:
ar_slice = ar[0:4]
ar_slice
Out[3]:
array([0, 1, 2, 3])
In [99]:
ar_slice[0] = 100

"""
スライスは元のリストの一部分を取り出して見ている。
スイスしたリストを変更すると元リストも変更される。
"""
ar
Out[99]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [5]:
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() 関数を使用すること
"""
Out[5]:
'\n完全に複製したい場合はcopy()メソドまたは\nnp.copy() 関数を使用すること\n'
In [6]:
# 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 ]])
       
'''
['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 ]]
Out[6]:
'\narray([[ 1.764,  0.4  ,  0.979,  2.241,  1.868],\n       [-2.553,  0.654,  0.864, -0.742,  2.27 ]])\n       \n'
In [7]:
# 条件制御
# ブールインデックスを生成する
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])

"""
Out[7]:
'\nTrueならx_aray , Falseならy_arrayを使用する\narray([ 1,  2, 33, 44,  5])\n\n'
In [8]:
#練習
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]
[[ 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 ]]
Out[8]:
array([[-0.977,  0.95 , -0.151, -0.103,  0.411]])
In [9]:
#練習
#cを抜き出す
bool_index = keys == 'c'
data[bool_index]
#array([[0.144, 1.454, 0.761, 0.122, 0.444]])
Out[9]:
array([[0.144, 1.454, 0.761, 0.122, 0.444]])
In [10]:
#練習
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)
Out[10]:
array([ 7,  8,  3,  4, 11])
In [11]:
# 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]
[  2.718   7.389  20.086  54.598 148.413]
[1.    1.414 1.732 2.    2.236]
[0.    1.    1.585 2.    2.322]
[ 0.841  0.909  0.141 -0.757 -0.959]
In [12]:
# 最大 最小 平均 合計
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])
Out[12]:
array([1.5, 5.5, 9.5])
In [13]:
# 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
Out[13]:
False
In [14]:
# 5以上の大きい数がいくつあるかカウントする
data = np.arange(12).reshape(3, 4)
print(data)
print(data >= 5)
print((data >= 5).sum())
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[False False False False]
 [False  True  True  True]
 [ True  True  True  True]]
7
In [15]:
# 対角成分の抽出と和
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
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
Out[15]:
30
In [16]:
np.sum(np.diag(data))
Out[16]:
30
In [17]:
# 練習
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))
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[[0.    1.    1.414 1.732]
 [2.    2.236 2.449 2.646]
 [2.828 3.    3.162 3.317]
 [3.464 3.606 3.742 3.873]]
15
0
120
7.5
30
In [18]:
# 配列操作とブロードキャスト
# 再形成(行列の次元を変更する
data = np.arange(10)
print(data)
print(data.reshape(2, 5))
print(data.reshape(5, 2))
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
 [5 6 7 8 9]]
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
In [19]:
# データの結合 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]]
 """
[[ 1  2  3]
 [ 4  5  6]
 [ 6  7  8]
 [ 9 10 11]]
[[ 1  2  3]
 [ 4  5  6]
 [ 6  7  8]
 [ 9 10 11]]
[[ 1  2  3]
 [ 4  5  6]
 [ 6  7  8]
 [ 9 10 11]]
[[ 1  2  3  6  7  8]
 [ 4  5  6  9 10 11]]
[[ 1  2  3  6  7  8]
 [ 4  5  6  9 10 11]]
Out[19]:
'\n[[ 1  2  3  6  7  8]\n [ 4  5  6  9 10 11]]\n '
In [30]:
# 配列の分割 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]]
"""
[[1 2 3]]
[[4 5 6]
 [6 7 8]]
[[ 9 10 11]]
In [64]:
# 配列の分割 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]
[[5 0 3]
 [3 7 9]
 [3 5 2]
 [4 7 6]
 [8 8 1]
 [6 7 7]
 [8 1 5]]
[[5 0 3]
 [3 7 9]]
[[3 5 2]]
[[4 7 6]
 [8 8 1]]
[[6 7 7]
 [8 1 5]]
[5 0 3]
[3 7 9]
In [76]:
# 繰り返し生成 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])

"""
Out[76]:
'\narray([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3])\n\n'
In [86]:
# ブロードキャスト
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]

"""
[0 1 2 3 4 5 6 7 8 9]
[ 3  4  5  6  7  8  9 10 11 12]
Out[86]:
'\n型が違っていてもnp.arrayは内部で一旦コピーして形を揃えてから演算してくれている。\n[ 3  4  5  6  7  8  9 10 11 12]\n\n'
In [96]:
# 練習 

# 縦に結合
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)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2  3  0  1  2  3]
 [ 4  5  6  7  4  5  6  7]
 [ 8  9 10 11  8  9 10 11]]
In [98]:
# 練習 pythonリストの要素に3を加える
li = [1, 2, 3, 4, 5]

np_ar = np.array(li)

# ブロードキャストを使用する
np_ar + 3 
"""
array([4, 5, 6, 7, 8])

"""
Out[98]:
array([4, 5, 6, 7, 8])