Pynote

Python、機械学習、画像処理について

numpy - 配列から値を取り出す、配列に値を代入する。

概要

numpy の配列から値を取り出す、配列に値を代入する関数を整理する。

一覧表

名前 説明
numpy.take 指定した axis 方向で指定したインデックスの要素を取り出す。
numpy.put 指定した axis 方向で指定したインデックスの場所に値を代入する。
numpy.take_along_axis 指定した axis 方向で指定したインデックスの要素を取り出す。
numpy.put_along_axis 指定した axis 方向で指定したインデックスの場所に値を代入する。
numpy.compress 指定した axis 方向で指定したブール型の配列の値が True の要素を取り出す。
numpy.place 指定したブール型の配列の値が True の場所に値を代入する。
numpy.select 指定したブール型の配列の値が True の値を取り出す。
numpy.putmask 指定したブール型の配列の値が True の場所に値を代入する。
numpy.diagonal 対角成分を取り出す。
numpy.fill_diagonal 対角成分に値を代入する。

numpy.take

指定した axis 方向で指定したインデックスの要素を取り出す。

関数

numpy.take(a, indices, axis=None, out=None, mode='raise')

例 axis を指定しない場合
axis=None (デフォルト) の場合は、1次元配列にした上で指定したインデックスの値を取り出す。

a = np.array([4, 3, 5, 7, 6, 8])
print(np.take(a, indices))  # [4 3 6]

b = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])
indices = [0, 1, 4]
print(np.take(b, indices))  # [0 1 4]

例 axis を指定した場合

axis を指定した場合は fancy index を使用した場合と同じである。

b = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])
indices = [0, 1, 4]
print(np.take(b, indices, axis=1))
# [[ 0  1  4]
#  [ 6  7 10]
#  [12 13 16]
#  [18 19 22]
#  [24 25 28]
#  [30 31 34]]

# 以下と同じ
print(b[:, indices])
# [[ 0  1  4]
#  [ 6  7 10]
#  [12 13 16]
#  [18 19 22]
#  [24 25 28]
#  [30 31 34]]

例 mode で範囲外のインデックスが指定された場合の扱い方を指定できる。

mode='raise' の場合、範囲外のインデックスを指定した場合、例外を送出する。

a = np.array([0, 1, 2, 3, 4, 5])
indices = [0, 1, 7, -7]
# a の有効なインデックス範囲は0 ~ 5, 逆から指定する場合は -1 ~ -6 である。

print(np.take(a, indices, mode='raise'))
# IndexError: index 7 is out of bounds for size 6

mode='wrap' の場合、範囲外のインデックスを指定した場合、繰り返した値をとる。

a = np.array([0, 1, 2, 3, 4, 5])
indices = [0, 1, 7, -7]
# a の有効なインデックス範囲は0 ~ 5, 逆から指定する場合は -1 ~ -6 である。

# 例えば、7は有効なインデックスは6までなので、0の値
print(np.take(a, indices, mode='wrap'))  # [0 1 1 5]

\displaystyle
\begin{array}{|c|c|}
\hline
インデックス & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & \cdots \\
\hline
解釈 & 0 & 1 & 2 & 3 & 4 & 5 & 0 & 1 & \cdots \\
\hline
\end{array}

\displaystyle
\begin{array}{|c|c|}
\hline
インデックス & \cdots & -8 & -7 & -6 & -5 & -4 & -3 & -2 & -1 \\
\hline
解釈 & \cdots & 4 & 5 & 0 & 1 & 2 & 3 & 4 & 5 \\
\hline
\end{array}

mode='clip' の場合、範囲外のインデックスを指定した場合、最も近い有効なインデックスの値をとる。

a = np.array([0, 1, 2, 3, 4, 5])
indices = [0, 1, 7, -7]
# a の有効なインデックス範囲は0 ~ 5, 逆から指定する場合は -1 ~ -6 である。

# 例えば、7に近い有効なインデックスは5、-7に近い有効なインデックスは-6である。
print(np.take(a, indices, mode='clip'))  # [0 1 5 0]

\displaystyle
\begin{array}{|c|c|}
\hline
インデックス & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & \cdots \\
\hline
解釈 & 0 & 1 & 2 & 3 & 4 & 5 & 5 & 5 & \cdots \\
\hline
\end{array}

\displaystyle
\begin{array}{|c|c|}
\hline
インデックス & \cdots & -8 & -7 & -6 & -5 & -4 & -3 & -2 & -1 \\
\hline
解釈 & \cdots & 0 & 0 & 0 & 1 & 2 & 3 & 4 & 5 \\
\hline
\end{array}

numpy.put

指定した axis 方向で指定したインデックスの場所に値を代入する。

関数

numpy.put(a, ind, v, mode='raise')

a = np.array([4, 3, 5, 7, 6, 8])
indices = [0, 1, 4]

np.put(a, indices, -1)
print(a)  # [-1 -1  5  7 -1  8]
b = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])
indices = [0, 1, 4]

np.put(a, indices, -1)
print(b)
# [[-1 -1  2  3 -1  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]
#  [24 25 26 27 28 29]
#  [30 31 32 33 34 35]]

numpy.take_along_axis

指定した axis 方向で指定したインデックスの要素を取り出す。

関数

numpy.take_along_axis(arr, indices, axis)

a = np.array([[1, 1, 1],
              [2, 2, 2],
              [3, 3, 3]])

indices = np.array([[0, 2, 1],
                    [1, 0, 2],
                    [2, 1, 0]])

# a の各列をそれに対応する indices の列に従い、取り出す。
print(np.take_along_axis(a, indices, axis=0))
# [[1 3 2]
#  [2 1 3]
#  [3 2 1]]
a = np.array([[1, 2, 3],
              [1, 2, 3],
              [1, 2, 3]])

indices = np.array([[0, 1, 2],
                    [2, 0, 1],
                    [1, 2, 0]])

# a の各行をそれに対応する indices の行に従い、取り出す。
print(np.take_along_axis(a, indices, axis=1))
# [[1 2 3]
#  [3 1 2]
#  [2 3 1]]

numpy.put_along_axis

指定した axis 方向で指定したインデックスの場所に値を代入する。

関数

numpy.put_along_axis(arr, indices, values, axis)

a = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])

indices = np.array([[0, 1, 4]])

np.put_along_axis(a, indices, -1, axis=1)
print(a)

numpy.compress

指定した axis 方向で指定したブール型の配列の値が True の要素を取り出す。

関数

numpy.compress(condition, a, axis=None, out=None)

a = np.array([[1, 2],
              [3, 4],
              [5, 6]])

print(np.compress([False, True, True], a, axis=0))
# [[3 4]
#  [5 6]]

print(np.compress([False, True], a, axis=1))
# [[2]
#  [4]
#  [6]]

numpy.place

指定したブール型の配列の値が True の場所に値を代入する。

関数

numpy.place(arr, mask, vals)

a = np.array([4, 3, 5, 7, 6, 8])

b = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])

vals = [-1, -2, -3, -4, -5, -6]

np.place(a, a < 5, -1)
print(a)  # [-1 -1  5  7  6  8]

np.place(b, b % 7 == 0, vals)
print(b)
# [[-1  1  2  3  4  5]
#  [ 6 -2  8  9 10 11]
#  [12 13 -3 15 16 17]
#  [18 19 20 -4 22 23]
#  [24 25 26 27 -5 29]
#  [30 31 32 33 34 -6]]

numpy.select

指定したブール型の配列の値が True の値を取り出す。

関数

numpy.select(condlist, choicelist, default=0)

x = np.arange(10)

condlist = [x < 3, x > 5]
choicelist = [x, x**2]

print(condlist)
# [array([ True, True, True, False, False, False, False, False, False, False]),
#  array([False, False, False, False, False, False, True, True, True, True])]
print(choicelist)
# [array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
#  array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])]

print(np.select(condlist, choicelist))

numpy.putmask

指定したブール型の配列の値が True の場所に値を代入する。

関数

numpy.putmask(a, mask, values)

a = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])

np.putmask(a, a % 7 == 0, -1)
print(a)
# [[-1  1  2  3  4  5]
#  [ 6 -1  8  9 10 11]
#  [12 13 -1 15 16 17]
#  [18 19 20 -1 22 23]
#  [24 25 26 27 -1 29]
#  [30 31 32 33 34 -1]]

numpy.diagonal

対角成分を取り出す。

関数

numpy.diagonal(a, offset=0, axis1=0, axis2=1)

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

print(np.diagonal(a))  # [1 5 9]

numpy.fill_diagonal

対角成分に値を代入する。

関数

numpy.fill_diagonal(a, val, wrap=False)

a = np.array([[0,  1,  2,  3,  4,  5],
              [6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23],
              [24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35]])

np.fill_diagonal(a, -1)
print(a)
# [[-1  1  2  3  4  5]
#  [ 6 -1  8  9 10 11]
#  [12 13 -1 15 16 17]
#  [18 19 20 -1 22 23]
#  [24 25 26 27 -1 29]
#  [30 31 32 33 34 -1]]