np.arrayの使い方#

np.arrayの作り方#

import numpy as np
def object_checker(obj):
    print("型:",type(obj))
    print("中身:",obj)
    if type(obj) == np.ndarray:
        print("行列のshape:",obj.shape)
list1 = [1,2,3]

object_checker(list1)
型: <class 'list'>
中身: [1, 2, 3]
arr1 = np.array(list1)

object_checker(arr1)
型: <class 'numpy.ndarray'>
中身: [1 2 3]
行列のshape: (3,)
list2 = [[1,2,3], [4,5,6]]
arr2 = np.array(list2)

object_checker(arr2)
型: <class 'numpy.ndarray'>
中身: [[1 2 3]
 [4 5 6]]
行列のshape: (2, 3)

numpy関数によるnp.arrayの初期化#

numpyはPythonに配列(np.array)を提供します。
このnp.arrayはリストやtupleを元に作るだけでなく、np.zeros、np.onesなどの関数からも作ることができます。

① np.zerosを使って要素数10の配列を作ってください。

np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

② np.onesを使ってshape (10,5)の行列を作ってください。

np.ones((10,5))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

③ np.arangeを使って0~9までの値を持ったベクトルを作ってください。

hint: np.arangeはrangeとほぼ同様の動作をします。

np.arange(3,10,2)
array([3, 5, 7, 9])

np.arrayのshapeの変更#

np.arrayはデータを効率的に扱うために、numpyの関数だけで配列の形を変形する事ができます。

もっとも代表的な方法として、np.reshapeがあります。

arr3 = np.arange(20)
arr4 = np.reshape(arr3, (10,-1)) # arr3.reshape((10,2))でも可

print(
    "オリジナル:\n",arr3,
    "\nreshape後:\n",arr4
)
オリジナル:
 [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19] 
reshape後:
 [[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]
 [10 11]
 [12 13]
 [14 15]
 [16 17]
 [18 19]]

④ ゼロで初期化した要素数30の配列を、5x2x3の三階テンソルに変換してください。

arr3 = np.zeros(30)
arr4 = np.reshape(arr3, (5,2,-1))
arr4.shape
(5, 2, 3)

行列の転置#

arr5 = arr4.T
arr5
array([[[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]],

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

       [[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]])

np.arrayの演算#

numpy.arrayは高速な行列演算が可能です。

また、計算の結果は尤もらしい型になります。

arr1の要素はint32ですが、1.0などのfloat64と演算する事で、計算結果result1がfloat64として出力されます。

加算#

result1 = arr1 +1.0
result1
array([2., 3., 4.])
print("arr1.dtype:",arr1.dtype)
print("result1.dtype:", result1.dtype)
arr1.dtype: int64
result1.dtype: float64

減算#

result2 = result1 - 5.0
result2
array([-3., -2., -1.])

乗算#

result3 = result2 * 1.5
result3
array([-4.5, -3. , -1.5])

除算#

result4 = result3 / 3.0
result4
array([-1.5, -1. , -0.5])

剰余#

result5 = result4 % 2
result5
array([0.5, 1. , 1.5])

等式#

result6 = result5 ==1
result6
array([False,  True, False])

不等式#

result7 = result5 !=1
result7
array([ True, False,  True])
result8 = result5 >=1
result8
array([False,  True,  True])
result8 = result5 <1
result8
array([ True, False, False])

要素が含まれているか確認する#

1 in result5
True
2 in result5
False
1 not in result5
False
2 not in result5
True

⑤ 以下の1~5までの処理をして答えを返す関数を作成して、実行してください。

  1. 1~20までの要素を持ったベクトルを用意

  2. ベクトルをreshapeし2x10行列に変換

  3. 配列の各要素を20倍

  4. 配列の各要素のmod 3をとる

  5. 配列の0をTrue、それ以外をFalseに変換

  6. 5の答えをreturn