Python NumPy / ndarray のメソッド #7

株式会社リュディアです。今回も NumPy についてまとめていきます。

前回までの NumPy / ndarray のメソッドについてのまとめへのリンクは以下を参考にしてください。

以下のリンクの内容を元にまとめを作っていきます。

今回から Item selection and manipulation に分類されるメソッドをまとめていきます。今回は take(), repeat() です。

では take() から見ていきます。take() の動きを一言で説明すると指定した軸に沿って要素を取り出す処理です。以下のコードを見てください。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
y = x.reshape(3, 4)
print(y)

print(y.take([0], 0))
print(y.take([0, 2], 0))

print(y.take([0], 1))
print(y.take([0, 3], 1))

#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [[1 2 3 4]]
#
# [[ 1  2  3  4]
#  [ 9 10 11 12]]
#
# [[1]
#  [5]
#  [9]]
#
# [[ 1  4]
#  [ 5  8]
#  [ 9 12]]
#

まず take の第2引数が軸を表現していることに注意してください。2次元行列の場合、第2引数が 0 の時は行方向1 の時は列方向になります。

では最初に y.take([0], 0)) を見ていきます。第2引数が 0 なので行方向ですね。つまり2次元配列 y の 0 行目を抜き出すことを示しています。 [1 2 3 4] を抜き出せていますね。

次の y.take([0, 2], 0)) も見てみましょう。これも第2引数が 0 なので行方向ですね。つまり2次元配列 y の 0 行目と 2行目を抜き出すことを示しています。 [1 2 3 4] と [9 10 11 12] の2行を2次元配列として抜き出せていることがわかりますね。

次にy.take([0], 1)) を見てみましょう。今度は第2引数が 1 なので列方向ですね。つまり2次元配列 y の 0 列目を抜き出すことを示しています。 [1 5 9]  を抜き出せていますね。

最後に y.take([0, 3], 1)) を見てみましょう。これも第2引数が 1 なので列方向ですね。つまり2次元配列 y の 0 列目と 3列目を抜き出すことを示しています。[1 5 9] と [4 8 12] の 2 列を 2次元配列として抜き出せていることがわかりますね。

では次に repeat() について見てみます。repeat() の動きを一言で説明すると配列の要素を繰り返す処理です。要素であることが重要です。以下のコードを見てください。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
y = x.reshape(3, 4)
print(y)

print(y.repeat(3, 0))
print(y.repeat(3, 1))

#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [[ 1  2  3  4]
#  [ 1  2  3  4]
#  [ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 5  6  7  8]
#  [ 5  6  7  8]
#  [ 9 10 11 12]
#  [ 9 10 11 12]
#  [ 9 10 11 12]]
#
# [[ 1  1  1  2  2  2  3  3  3  4  4  4]
#  [ 5  5  5  6  6  6  7  7  7  8  8  8]
#  [ 9  9  9 10 10 10 11 11 11 12 12 12]]
#

repeat() の第2引数も take() と同じく 0 であれば行方向1 であれば列方向に対する指示になります。では y.repeat(3, 0) から見ていきましょう。2次元配列 y の 各行を 3 回ずつ繰り返して作った 2次元配列ができます。各行が 3回ずつ繰り返されてることがわかりますね。

同様に第2引数を 1 として列方向に各列を 3 回ずつ繰り返した例も示しておきます。簡単ですね。

ただ実際問題、このような繰り返しが必要な状況はあまりなくて、以下のような繰り返しが必要なことが多いのではないでしょうか。NumPy のスライシングに関わるのでここでは例のみにしておきます。また厳密に言うと ndarray のメソッドではなくて NumPy の関数を使っています。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
y = x.reshape(3, 4)
print(y)

print(np.repeat(y[None, :], 3, 0))
print(np.repeat(y[:, None], 3, 1))

#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [[[ 1  2  3  4]  <-- 3回繰り返しの1回目
#   [ 5  6  7  8]
#   [ 9 10 11 12]]
#
#  [[ 1  2  3  4]  <-- 3回繰り返しの2回目
#   [ 5  6  7  8]
#   [ 9 10 11 12]]
#
#  [[ 1  2  3  4]  <-- 3回繰り返しの3回目
#   [ 5  6  7  8]
#   [ 9 10 11 12]]]
#
# [[[ 1  2  3  4]  <-- 1行目を3回繰り返し
#   [ 1  2  3  4]
#   [ 1  2  3  4]]
#
#  [[ 5  6  7  8]  <-- 2行目を3回繰り返し
#   [ 5  6  7  8]
#   [ 5  6  7  8]]
#
#  [[ 9 10 11 12]  <-- 3行目を3回繰り返し
#   [ 9 10 11 12]
#   [ 9 10 11 12]]]
#

NumPy / ndarray のメソッドに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。



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