NumPyで「1次元配列」をやってみた。

Numpy は Pythonでベクトルや行列計算を行うために特化した、科学技術計算に便利なライブラリ。

Numpyで配列を高速に処理するために ndarray (N-d Array = N次元配列) があり、ndarrayを生成するためには、np.array()関数の引数にPythonリスト型のオブジェクトを渡してあげれば良い。

import numpy as np

# 1次元配列 ベクトル
array_1 = np.array([1,2,3,4,5,6,7,8])

# 2次元配列 行列
array_2 = np.array([[1,2,3,4],[5,6,7,8]])

# 3次元配列 テンソル
array_3 = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])

storages = [9, 15, 7, 21, 15, 22, 44]

np_storages = np.array(storages)
print(type(np_storages))

#実行結果
<class 'numpy.ndarray'>

1次元配列の計算 (Numpyを使わずに)

### Numpryを使わずにndarrayの要素同士を=+する

# (1) 間違った例
list = [1,2,3,4]

list += list

print("間違った例: " + str(list))

# [1, 2, 3, 4, 1, 2, 3, 4]
# ↑ これでは 要素が足されるだけ

# (2) 正しい例 (Loopで書く例)

list = [1,2,3,4]
list_new = []

for n in list:
    n += n
    list_new.append(n)
print("正しい例: " + str(list_new))


# 実行結果

間違った例: [1, 2, 3, 4, 1, 2, 3, 4]
正しい例: [2, 4, 6, 8]

1次元配列の計算(Numpyを使うと簡単!)

import numpy as np

list_array = np.array(list)
list_array += list_array
print(list_array)

#実行結果
[2 4 6 8]


minus = list_array - list_array
print(minus)

multipy = list_array * list_array
print(multipy)

cubed = list_array ** 3
print(cubed)

division = 1 / list_array
print(division)

# 実行結果

[0 0 0 0]
[ 4 16 36 64]
[  8  64 216 512]
[0.5        0.25       0.16666667 0.125     ]

ndarrayの注意点

・リストと同じように、代入したあとに変更すると元の配列も影響される。
 copyを使えば元の配列に影響はない

arr1 = np.array([1,2,3,4,5])
arr2 = arr1
print(arr1)
arr2[0] = 100
print(arr1)

# 実行結果
[1 2 3 4 5]
[100   2   3   4   5]

# copyを使えば元の配列に影響はない
arr1 = np.array([1,2,3,4,5])
print(arr1)

arr3 = arr1.copy()
arr3[0] = 100
print(arr1)

# 実行結果
[1 2 3 4 5]
[1 2 3 4 5]


・スライスでは、代入したあとに変更すると元の配列も影響される。
 (リストは、スライスで複製した場合でも、元の配列は影響されない)
   --> copyを使えば元の配列に影響はない

arr_Numpy = np.arange(10)
print("arr_Numpy:", arr_Numpy)
print()

arr_Numpy_view = arr_Numpy[:]
arr_Numpy_view[0] = 100
print("Numpyのスライスでは view(データが格納されている場所の情報)が代入されるので arr_Numpy_viewの変更がarr_Numpyに変更される")
print(arr_Numpy)


# 実行結果
arr_Numpy: [0 1 2 3 4 5 6 7 8 9]

Numpyのスライスでは view(データが格納されている場所の情報)が代入されるので arr_Numpy_viewの変更がarr_Numpyに変更される
[100   1   2   3   4   5   6   7   8   9]
arr_Numpy = np.arange(10)
print("arr_Numpy:", arr_Numpy)
print()

arr_Numpy_view = arr_Numpy[:].copy()
arr_Numpy_view[0] = 100
print("Numpyのスライスで copy を使った場合は コピーが生成されているので、arr_Numpy_copyはarr_Numpuyに影響しない")
print(arr_Numpy)


# 実行結果
arr_Numpy: [0 1 2 3 4 5 6 7 8 9]

Numpyのスライスで copy を使った場合は コピーが生成されているので、arr_Numpy_copyはarr_Numpuyに影響しない
[0 1 2 3 4 5 6 7 8 9]

いいなと思ったら応援しよう!

YSTK
今回の"note"を気に入って頂けましたら、是非サポートをお願いいたします!