見出し画像

GCI (東京大学オンライン講義)第3回 練習問題 1 【解説あり】

今回は、現在僕が受講している。GCI(東京大学オンラインクラス)で出題された、練習問題について解いていきたいと思います。ちょっと難しいと思う方は他にも問題があるので僕のほかの投稿を見てみてください。

問1) (1) 1次元であなたの好きな値を要素にもつ同じ長さのnp.ndarrayを2つ作成し,type()関数を用いてnp.ndarrayになっていることを確認してください。

def make_list(): 
   x = []
   n = int(input("Enter a number of elements: ")) 
   for i in range (0, n):
       el = int(input("Enter a number: "))
       x.append(el)
   return x 

毎回listを打ち込むのが面倒だったので、listを作る関数を先に書きました。習ったことしか使っていないので、第二回の内容を見ればわかると思います。

import numpy as np #import numpy

a = make_list() #using the function which I made above 
b = make_list() #using the function which I made above 

a = np.array(a) #convert to ndarray about a
b = np.array(b) #convert to ndarray about b

print("Type of a: ", type(a)) #print the type 
print("Type of b: ", type(b)) #print the type

pythonのlistはnp.array()を用いることでnp.ndarrayに変換することができます。printでtype(example)を用いて確認すると、無事ndarrayになっていることが、確認できました。

実行結果
Enter a number of elements: 5
Enter a number: 2
Enter a number: 3
Enter a number: 4
Enter a number: 5
Enter a number: 6
[2, 3, 4, 5, 6]
Enter a number of elements: 5
Enter a number: 5
Enter a number: 4
Enter a number: 3
Enter a number: 2
Enter a number: 1
[5, 4, 3, 2, 1]
Type of a: <class 'numpy.ndarray'>
Type of b: <class 'numpy.ndarray'>

問1) (2) (1)で作成した2つの1次元配列に対して四則演算を行ってください。

print(a+b)
print(a-b)
print(a*b)
print(a/b)

既に、(1)でlistから、ndarrayに変換したので、簡単に四則演算ができます。

実行結果
[7 7 7 7 7]
[-3 -1 1 3 5]
[10 12 12 10 6]
[0.4 0.75 1.33333333 2.5 6. ]

ちなみに、ndarrayに変換する前に、実行するとprint(a+b)の結果のみ返します。ここでは、ndarrayの+とは違い、結合の意味での+です。その他は、Errorを返します。

実行結果
[2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-9030076442e3> in <module>()
3
4 print(a+b)
----> 5 print(a-b)
6 print(a*b)
7 print(a/b)
TypeError: unsupported operand type(s) for -: 'list' and 'list'

問2) 1次元配列を一つ入力とし,出力が入力を規格化した1次元配列となるような関数を作成してください。ここで,ベクトルの規格化とは元々のベクトルとは並行で,全ての要素の和が1となるようにすることです。このとき,Numpyのユニバーサルな演算や関数のみを用いて実装してください。

正規化(Normalize)とは、、、
ベクトルの長さでベクトルの各要素を割るだけで算出することができる。
つまり、単位ベクトルの a = a / ベクトル長さ
この単位ベクトルに変換する計算を正規化と呼びます。
長さ(通常ノルムとよびます)は、要素の2乗の合計を、√でとった値の事です。
ユニバーサル関数とは、、、
NumPyの多次元配列(numpy.ndarray)で、要素ごとに演算を行い、結果も同一サイズになる関数です。
def normalize(a):
   a = np.array(a)
   x = np.sqrt(np.sum(np.power(a,2))) #def x as norm
   a = a/x
   return a

a = make_list()
normalize(a)
実行結果
Enter a number of elements: 3
Enter a number: 1
Enter a number: 2
Enter a number: 3
[1, 2, 3]
array([0.26726124, 0.53452248, 0.80178373])

※ np.sqrt(np.sum(np.power(a,2)))をnp.linalg.norm(a)としても、同じ値が返ってきますが linalg.norはユニバーサル関数ではないので、ここでは使えなですね。
ユニバーサル関数は以下で確認できます。

~最後に~

最後まで読んでいただき、ありがとうございます。質問や間違えているところがあればコメントで教えていただければ嬉しいです。続きの問題もどんどん投稿していくのでよろしくお願いします!
スキくれると嬉しいです!

この記事が気に入ったらサポートをしてみませんか?