Numpy入門編の続きです。
Numpyは、Pythonにおける数値計算処理の土台になっているライブラリで、続くPandasやAIなどへの基礎にもなっているのでぜひともモノにしておきたいところです。
仕事でのデータ処理を行う上でも基本として身につけておきたいですね。
今回も相変わらずNumpyの公式ページの入門編をなぞっていきます。
配列の基本操作
a = np.array(
[1, 2]
)
b = np.ones(2, dtype='int32')
print('a = ', a)
print('b = ', b)
print('a + b = ', a + b)
print('a - b = ', a - b)
print('a * b = ', a * b)
print('a / a = ', a / a)
print('a / b = ', a / b)
a = [1 2]
b = [1 1]
a + b = [2 3]
a - b = [0 1]
a * b = [1 2]
a / a = [1. 1.]
a / b = [1. 2.]
c = np.array(
[
[1, 2],
[3, 4]
]
)
d = np.array(
[
[5, 6],
[7, 8]
]
)
print('c + d = ', c + d)
print('c - d = ', c - d)
print('c * d = ', c * d)
c + d = [[ 6 8]
[10 12]]
c - d = [[-4 -4]
[-4 -4]]
c * d = [[ 5 12]
[21 32]]
行列計算とは違いますね。
同じインデックスの要素同士の演算になっています。ご注意を!!!
e = np.array(
[1, 2, 3, 4]
)
print('e.sum() = ', e.sum())
f = np.array(
[
[1, 1],
[2, 2]
]
)
print('f.sum(axis=0) = ', f.sum(axis=0))
print('f.sum(axis=1) = ', f.sum(axis=1))
e.sum() = 10
f.sum(axis=0) = [3 3]
f.sum(axis=1) = [2 4]
axis=0で、行方向(列ごと)の和を取っています。
axis=1で、列方向(行ごと)の和を取っていますね。
g = f * 2
print(g)
[[2 2]
[4 4]]
合計値・最大値・最小値
a = np.array(
[
[0.1234, 0.2345, 0.3456, 0.4567],
[0.2345, 0.3456, 0.4567, 0.5678],
[0.3456, 0.4567, 0.5678, 0.6789]
]
)
print('a.sum() = ', a.sum())
print('a.min() = ', a.min())
print('a.max() = ', a.max())
print('a.max(axis=0) = ', a.max(axis=0))
print('a.max(axis=1) = ', a.max(axis=1))
a.sum() = 4.8138
a.min() = 0.1234
a.max() = 0.6789
a.max(axis=0) = [0.3456 0.4567 0.5678 0.6789]
a.max(axis=1) = [0.4567 0.5678 0.6789]
行列
a = np.array(
[
[1, 2],
[3, 4]
]
)
print('a = ', a)
print('a[0, 0] = ', a[0, 0])
print('a[0, 1] = ', a[0, 1])
print('a[1, 0] = ', a[1, 0])
print('a[1, 1] = ', a[1, 1])
print('a[1:3] = ', a[1:3])
print('a[0:] = ', a[0:])
print('a[0] = ', a[0])
print('a[:, 0] = ', a[:, 0])
a = [[1 2]
[3 4]]
a[0, 0] = 1
a[0, 1] = 2
a[1, 0] = 3
a[1, 1] = 4
a[1:3] = [[3 4]]
a[0:] = [[1 2]
[3 4]]
a[0] = [1 2]
a[:, 0] = [1 3]
スライスの場合、範囲を1つだけ指定した場合は、行のスライスとなります。
print('a.max() = ', a.max())
print('a.min() = ', a.min())
print('a.sum() = ', a.sum())
print('a.max(axis=0) = ', a.max(axis=0))
print('a.max(axis=1) = ', a.max(axis=1))
a.max() = 4
a.min() = 1
a.sum() = 10
a.max(axis=0) = [3 4]
a.max(axis=1) = [2 4]
axis=0を指定したときは、列ごとの最大値(最小値)を返し、axis=1の場合は、行ごとの結果を返します。
b = np.ones([2, 2])
print('b = ', b)
print('a + b = ', a + b)
print('a * b = ', a * b)
print('np.matmul(a, b) = ', np.matmul(a, b))
print('np.dot(a, b) = ', np.dot(a, b))
c = np.matrix(
[
[1, 2],
[3, 4]
]
)
d = np.matrix(
[
[1, 1],
[1, 1]
]
)
print('c = ', c)
print('d = ', d)
print('c * d = ', c * d)
b = [[1. 1.]
[1. 1.]]
a + b = [[2. 3.]
[4. 5.]]
a * b = [[1. 2.]
[3. 4.]]
np.matmul(a, b) = [[3. 3.]
[7. 7.]]
np.dot(a, b) = [[3. 3.]
[7. 7.]]
c = [[1 2]
[3 4]]
d = [[1 1]
[1 1]]
c * d = [[3 3]
[7 7]]
行列の内積を求めたい場合は、np.matmul()やnp.dot()を使用します。
np.array()に対して、演算子*を利用した場合は、要素ごとのスカラー積が計算されます。
行列に特化したnp.matrix()を使って行列を定義することで演算子*を用いて内積計算を行うこともできます。
乱数
a = np.random.default_rng(0)
print('a = ', a)
b = a.integers(5, size=(2, 4))
print('b = ', b)
c = a.integers(10, size=(2, 4))
print('c = ', c)
a = Generator(PCG64)
b = [[4 3 2 1]
[1 0 0 0]]
c = [[1 8 6 9]
[5 6 9 7]]
np.random.default_rng()によって、Generatorなるものが生成されています。
このGeneratorを利用することで、ランダムな値を作ることができるようになっています。
配列からユニークな値を取り出す
a = np.array(
[11, 11, 12, 13, 14, 15, 16, 17, 12, 13, 11, 14, 18, 19, 20]
)
b = np.unique(a)
print('b = ', b)
c, d = np.unique(a, return_index=True)
print('c = ', c)
print('d = ', d)
print('a[d] = ', a[d])
e, f = np.unique(a, return_counts=True)
print('f = ', f)
b = [11 12 13 14 15 16 17 18 19 20]
c = [11 12 13 14 15 16 17 18 19 20]
d = [ 0 2 3 4 5 6 7 12 13 14]
a[d] = [11 12 13 14 15 16 17 18 19 20]
f = [3 2 2 2 1 1 1 1 1 1]
np.unique()に引数return_index=Trueを指定すると、ユニークな要素のインデックスリストを取り出すことができます。
return_counts=Trueを指定すると、ユニークな要素がそれぞれいくつ含まれているかを調べることができます。
g = np.array(
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[1, 2, 3, 4],
[1, 2, 3, 5],
]
)
print('g = ', g)
print('np.unique(g) = ', np.unique(g))
print('np.unique(g, axis=0) = ', np.unique(g, axis=0))
g = [[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[ 1 2 3 4]
[ 1 2 3 5]]
np.unique(g) = [ 1 2 3 4 5 6 7 8 9 10 11 12]
np.unique(g, axis=0) = [[ 1 2 3 4]
[ 1 2 3 5]
[ 5 6 7 8]
[ 9 10 11 12]]
多重配列の場合、np.unique()の引数にaxisを指定することで、ユニークな行 or 列を取り出すことができます。
配列の組み換え
a = np.array(
[1, 2, 3, 4, 5, 6]
)
print('a = ', a)
b = a.reshape(2, 3)
print('b = ', b)
c = a.reshape(3, 2)
print('c = ', c)
print('b.T = ', b.T)
a = [1 2 3 4 5 6]
b = [[1 2 3]
[4 5 6]]
c = [[1 2]
[3 4]
[5 6]]
b.T = [[1 4]
[2 5]
[3 6]]
Tメソッドを利用することで、転置行列を取得できます。
要素を逆順に並べ替える
a = np.array(
[1, 2, 3, 4, 5, 6, 7, 8]
)
b = np.flip(a)
print('b = ', b)
c = np.array(
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
)
d = np.flip(c)
print('d = ', d)
e = np.flip(d, axis=0)
print('e = ', e)
f = np.flip(d, axis=1)
print('f = ', f)
b = [8 7 6 5 4 3 2 1]
d = [[12 11 10 9]
[ 8 7 6 5]
[ 4 3 2 1]]
e = [[ 4 3 2 1]
[ 8 7 6 5]
[12 11 10 9]]
f = [[ 9 10 11 12]
[ 5 6 7 8]
[ 1 2 3 4]]
多重配列の場合、axisを指定することで並べ替える方向(行・列)を指定できます。
多重配列から1次元配列への変換
a = np.array(
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
)
print('a.flatten() = ', a.flatten())
b = np.array(
[
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
],
[
[13, 14, 15],
[16, 17, 18],
[19, 20, 21],
[22, 23, 24],
]
]
)
print('b.flatten() = ', b.flatten())
a.flatten() = [ 1 2 3 4 5 6 7 8 9 10 11 12]
b.flatten() = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
何次元の配列であっても、flatten()で1次元配列へ変換できます。
今回はここまで。
Numpyについて、もっと詳しく知りたいなら公式ページへGoです。
次回は、Pandasの使い方を見ていきます。
コメント