oikakerublogの日記

知識ゼロから色々しらべてみた話し

Python Numpyに慣れる100エクササイズ

◆ベクトルを作る・いじる

f:id:oikakerublog:20170906004053j:plain

☞ ”array” ・・・要素指定で配列を生成する

 print(np.array([[1, 2, 3], [4, 5, 6]]))

=>

[[1 2 3]
[4 5 6]]

 

☞ ”arange”・・・連番の配列を作る

print(np.arange(5))  # start = 0 (default), end = 5
print(np.arange(1,5))  # start = 1, end = 5
print(np.arange(1,5,0.5))  # start = 1, end = 5, slice = 0.5

=>

[0 1 2 3 4]
[1 2 3 4]
[ 1. 1.5 2. 2.5 3. 3.5 4. 4.5]

☞ ”flatten”・・・一次元化

W = np.array([[1, 2, 3], [4, 5, 6]])
print(W)
print(W.flatten())

=>

[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]

 

☞ ”reshape”・・・行列のかたちを変更

print(np.arange(48).reshape(8, 6))

=>

f:id:oikakerublog:20170425001509p:plain

A = np.arange(24).reshape(2,3,4) #2つの行列に分ける
print(A)

=>

[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

 

☞ ”shape”・・・配列の値の数を得る

(1) 3x2行列.shape → (3,2)

(2)3x2行列.shape [0]→ 行の数 この例では3

ex:

X = np.arange(12).reshape(3,4)
print(X)

=>

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

ex:

print(X.shape)
print(X.shape[0])

=>

(3, 4)
3

ex:

b = np.array([2,4,6,8])

print(b.shape) 

=>

(4,)

 

”zeros”・・・全部0の配列を作る (cf. 全部1なら”ones”)

Z1 = np.zeros(5) #一次元

Z2 = np.zeros*1 #2行3列のように形状指定もOK
print(Z1)

print(Z2)

=>

[ 0. 0. 0. 0. 0.]
[[ 0. 0. 0.]
[ 0. 0. 0.]]

 

・参考)4つ目が1

Z = np.zeros(10)
Z[4] = 1
print(Z)

=>

[ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]

 

☞  ”np.random.choice()”・・・ランダム

・指定された数字の中からランダムに好きな数を取り出す

np.random.choice(100,3) #0〜99のうちランダムに3つ数字を抽出

=>

array([89, 41, 92])

◆ ”def”・・・関数を定義

def add(x, y):
print x + y

add(3, 5)

=> 8

 

◆ ”numpy.newaxis”・・・縦配置

(1)ヨコ→タテ

array = np.arange(5)
print (array[:, np.newaxis])

=>

 [[0]
[1]
[2]
[3]
[4]]

(2)九九表を作る

m = np.array([1,2,3,4,5,6,7,8,9])
n = np.array([1,2,3,4,5,6,7,8,9])
print(m[:, np.newaxis]) # m配列を縦に
print(m[:, np.newaxis]*n) # それにn配列を掛け算していく

f:id:oikakerublog:20170424233738p:plain

☞ その7・・・エレメントをリバースする

Z = np.arange(15)
Z = Z[::-1]
print(Z)

=>

[14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]

 

☞ その8・・・3x3のマトリクス

Z = np.arange(9).reshape(3,3)
print(Z)

=>

[[0 1 2]
[3 4 5]
[6 7 8]]

 

☞ その9・・・ある行列からindexをさがす

nz = np.nonzero([1,2,0,0,4,0])
print(nz)

=>

(array([0, 1, 4], dtype=int64),)

 

☞ その10・・・identity matrix 単位行列

Z = np.eye(3)
print(Z)

=>

[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]

 

☞ その11・・・3x3x3のランダム行列の作成

Z = np.random.random*2
print(Z)

=>

[[[ 0.86816012 0.54928482 0.10620469]
[ 0.56253858 0.42498644 0.38111299]
[ 0.46583937 0.06876381 0.47205835]]

[[ 0.48659812 0.53796306 0.83180752]
[ 0.54321802 0.2645361 0.6461197 ]
[ 0.69551154 0.60727098 0.36739499]]

[[ 0.31582316 0.86979075 0.77204474]
[ 0.93540842 0.18592936 0.17472491]
[ 0.87547108 0.59652846 0.87853689]]]

 

☞ その12・・・3x3のランダム行列を作り、その中の要素の最大値/最小値を抽出

Z = np.random.random*3
Zmin, Zmax = Z.min(), Z.max()
print(Z)
print(Zmin, Zmax)

=>

[[ 0.92771297 0.99119487 0.33149293]
[ 0.48005022 0.61086498 0.19062979]
[ 0.05214626 0.61618909 0.08295882]]
0.0521462614894 0.991194872459

 

☞ その13・・・要素の平均値(mean value)を出す

Z = np.random.random(3)
m = Z.mean()
print(Z)
print(m)

=>

[ 0.43252845 0.86545314 0.8868291 ]
0.728270233139

 

☞ その16・・・対角の1つ下の行列を作る、1~4、diagonal

Z = np.diag(1+np.arange(4),k=-1)
print(Z)

=>

[[0 0 0 0 0]
[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]]

 

☞ その17・・・チェックボードパターンの行列

Z = np.zeros*4
print(Z)

=>

[[0 1 0 1]
[1 0 1 0]
[0 1 0 1]
[1 0 1 0]]

 

☞ その20・・・Normalize(最大が1&最小が0になる)

Z = np.random.random*5
Zmax, Zmin = Z.max(), Z.min()
Z = (Z - Zmin)/(Zmax - Zmin)
print(Z)

=>

[[ 0.91425657 0.07881159 1. ]
[ 0.63918169 0.58862944 0.43357481]
[ 0.4049732 0.1090024 0. ]]

 

☞ その21・・・Create a custom dtype that describes a color as four unisgned bytes

 

☞ その22・・・Multiply a 5x3 matrix by a 3x2 matrix (real matrix product)

 

☞ その23・・・1~10のうち3~8をnegateする

Z = np.arange(11)
Z[(3 < Z) & (Z <= 8)] *= -1
print(Z)

=>[ 0 1 2 3 -4 -5 -6 -7 -8 9 10]

 

☞ その24・・・Consider an integer vector Z, which of these expressions are legal

 

☞ その27・・・How to round away from zero a float array ?

Z = np.random.uniform(-10,+10,10)
print (np.trunc(Z + np.copysign(0.5, Z)))

=>

[ -8. 4. 6. -3. 1. 4. 10. 2. -7. -8.]

 

☞ その28・・・整数部の抽出、やり方イロイロ

# 1~5のランダムな数を5つ持つ行列
Z = np.random.uniform(1,5,5)
print (Z)


# 整数の抽出
print (Z - Z%1)
print (np.floor(Z))
print (np.ceil(Z)-1)
print (Z.astype(int))
print (np.trunc(Z))

=>

[ 3.5029238 4.47885352 1.91640941 1.43928684 4.46256647]
[ 3. 4. 1. 1. 4.]
[ 3. 4. 1. 1. 4.]
[ 3. 4. 1. 1. 4.]
[3 4 1 1 4]
[ 3. 4. 1. 1. 4.]

 

☞ その29・・・5x5 matrix with row values ranging from 0 to 4

Z = np.zeros*6
Z += np.arange(5)
print(Z)

=>

[[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]]

 

☞ その30・・・Consider a generator function that generates 10 integers and use it to build an array 

 

◆行列&ベクトルに関する計算 

 ☞ スカラー演算

W = np.array([[1, 2, 3], [4, 5, 6]])
x = np.array([7, 8, 9])

print(W * 2) #要素を2倍
print(-x)   #要素にマイナス

=>

[[ 2 4 6]
[ 8 10 12]]
[-7 -8 -9]

 

☞ 行列を計算する際の方向 ”axis”

f:id:oikakerublog:20170422140552j:plain

 

W = np.array([[1, 2, 3], [4, 5, 6]])
print(W.sum())

print(W.sum(axis=0))

print(W.sum(axis=1))

=>

21
[5 7 9]
[ 6 15]

 

◆行列の積 ”matmul”

(1)行列とベクトル

A = np.array([[2,3,4], [3,4,5]]) #行列
y = np.array([1,2,3]) #ベクトル
print(A)
print(y)
print(np.matmul(A, y))
=>

[[2 3 4]
[3 4 5]]
[1 2 3]
[20 26]  #積の答え

 

(2)行列と行列

A = np.array([[2,3,4], [3,4,5]]) #行列
B = np.array([[2,3], [3,4],[4,5]]) #行列
print(A)
print(B)
print(np.matmul(A, B))

=>

[[2 3 4]
[3 4 5]]
[[2 3]
[3 4]
[4 5]]
[[29 38] #積の答え
[38 50]]

 

print(np.matmul(W, W.T))
print(np.matmul(W.T, W))

 

 ◆”dot”積

・行やベクトルしか関係しない計算であればmatmalとdotは差ナシ

A = np.array([[2,3,4], [3,4,5]])
B = np.array([[2,3], [3,4],[4,5]])
print(np.dot(A, B))

=> 

[[29 38] #積の答え
[38 50]]

 

 

 

 

 

 

 

 

 

 

*1:2,3

*2:3,3,3

*3:3,3

*4:4,4),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
print(Z)

=>

[[0 1 0 1]
[1 0 1 0]
[0 1 0 1]
[1 0 1 0]]

 

☞ その18・・・Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element?

print(np.unravel_index(100,(6,7,8)))

=>

(1, 5, 4)

 

☞ その19・・・tileファンクションを使ってチェックボード

Z = np.tile( np.array([[0,1],[1,0]]), (2,2

*5:3,3

*6:5,5