2.4. NumPy

[1]:
import numpy as np # numpyのインポート

2.4.1. NumPy配列の生成

[2]:
x = np.array([1.0, 2.0, 3.0])
print(x)
[1. 2. 3.]
[3]:
type(x)
[3]:
numpy.ndarray

2.4.2. NumPyの算術計算

[4]:
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
[5]:
x + y
[5]:
array([3., 6., 9.])
[6]:
x - y
[6]:
array([-1., -2., -3.])
[7]:
x * y   # element-wise product
[7]:
array([ 2.,  8., 18.])
[8]:
x / y
[8]:
array([0.5, 0.5, 0.5])
  • x, yの要素数が同じ (要素数3の1次元配列)

  • 要素数が同じ場合、算術計算は各要素に対して行われる

  • 要素ごとは、英語で「element-wise」と呼ばれる

[9]:
x = np.array([1.0, 2.0, 3.0])
x / 2.0 # スカラ値を組み合わせた計算は、
[9]:
array([0.5, 1. , 1.5])

2.4.2.1. 🤔NumPyを使わないで配列を計算するとどうなるか

[10]:
a = [0, 1, 2]
b = [3, 4, 5]
[11]:
a + b # 行列の結合
[11]:
[0, 1, 2, 3, 4, 5]
[12]:
a - b
----------------------------------------------------------------
TypeError                      Traceback (most recent call last)
<ipython-input-12-09bd029d0285> in <module>
----> 1 a - b

TypeError: unsupported operand type(s) for -: 'list' and 'list'
[13]:
a * b
----------------------------------------------------------------
TypeError                      Traceback (most recent call last)
<ipython-input-13-9bc1a869709f> in <module>
----> 1 a * b

TypeError: can't multiply sequence by non-int of type 'list'
[14]:
a / b
----------------------------------------------------------------
TypeError                      Traceback (most recent call last)
<ipython-input-14-d8e10abd5ab6> in <module>
----> 1 a / b

TypeError: unsupported operand type(s) for /: 'list' and 'list'
[15]:
a * 5
[15]:
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]

2.4.3. NumPyのN次元配列

[16]:
A = np.array([[1, 2], [3, 4]])
print(A)
[[1 2]
 [3 4]]
[17]:
A.shape # 行列Aの形状。つまりこれは2次元配列であることを示す
[17]:
(2, 2)
[18]:
A.dtype # 要素のデータ型
[18]:
dtype('int32')
[19]:
B = np.array([[3, 0], [0, 6]])
A + B
[19]:
array([[ 4,  2],
       [ 3, 10]])
[20]:
A * 10
[20]:
array([[10, 20],
       [30, 40]])

2.4.4. ブロードキャスト

  • 2次元配列とスカラ値の掛け算では、スカラ値が2次元配列に変換された後に計算される

[21]:
A = np.array([[1, 2], [3, 4]]) # ((A1, A2), (A3, A4))
B = np.array([10, 20])         # (B1, B2)
A * B                          # = ((A1 * B1, A2 * B2), (A3 * B1, A4 * B2))
[21]:
array([[10, 40],
       [30, 80]])

2.4.5. 要素へのアクセス

[22]:
X = np.array([[51, 55], [14, 19], [0, 4]])
print(X)
[[51 55]
 [14 19]
 [ 0  4]]
[23]:
X[0]
[23]:
array([51, 55])
[24]:
X[0][1]
[24]:
55
[25]:
for row in X:
    print(row)
[51 55]
[14 19]
[0 4]
[26]:
X = X.flatten() # Xを1次元配列へ変換
print(X)
[51 55 14 19  0  4]
[27]:
X[np.array([0, 2, 4])] # インデックスが0, 2, 4番目の要素を取得
[27]:
array([51, 14,  0])
[28]:
X > 15 # Xが15以上である要素の結果
[28]:
array([ True,  True, False,  True, False, False])
[29]:
X[X > 15] # Xが15以上の要素のみを抽出
[29]:
array([51, 55, 19])