[NumPy] 非ゼロ要素のインデクスとカウント

[NumPy] 非ゼロ要素のインデクスとカウント

numpy.nonzero()

 numpy.nonzero() は配列の非ゼロ要素のインデクス配列をタプルで返します。

# NZ-1

import numpy as np

# 配列を定義
x = np.array([[5, 0, 1],
              [3, 8, 0]])

# 非ゼロ要素のインデクス配列
a = np.nonzero(x)

print(a)
(array([0, 0, 1, 1], dtype=int32),
 array([0, 2, 0, 1], dtype=int32))

 タプルの 1 つめの要素は、非ゼロ要素 5, 3, 8, 1 の行方向のインデクスです。2 つめの要素は非ゼロ要素 5, 1, 3, 8 の列方向のインデクスです。この 2 種類のインデクス配列を組合わせれば、非ゼロ要素を指定することができます。すなわち、
 

[0, 0], [0, 2], [1, 0], [1, 1]

が非ゼロ要素の 2 次元インデクスとなっています。したがって、numpy.nonzero() で取得したインデクス配列を使えば、もとの配列の非ゼロ要素を抽出することができます。

# NZ-1

# xから非ゼロ要素を抽出
print(x[a])
[5 1 3 8]

 

numpy.flatnonzero()

 numpy.flatnonzero() は受け取った配列をフラットにして、非ゼロ要素のインデクスを返します。

# FNZ

import numpy as np

# 配列xを定義
x = np.array([[0, 1, 2],
              [3, 0, 0],
              [4, 0, 5]])

# xをフラットにして非ゼロ要素のインデクス配列を生成
fnz = np.flatnonzero(x)

print(fnz)
[1 2 3 6 8]

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

中古価格
¥2,818から
(2019/7/30 20:24時点)

numpy.count_nonzero()

 numpy.count_nonzero() は非ゼロ要素を数えます。

# CNZ-1

import numpy as np

# 配列を定義
x = np.array([[7, 0, 3],
              [5, 8, 0],
              [0, 0, 2]])

# 非ゼロ要素を数える
c1 = np.count_nonzero(x)

print(c1)
5

 axis=0 を指定すると行方向に非ゼロ要素をカウントします。

# CNZ-2

# 行方向に非ゼロ要素を数える
c2 = np.count_nonzero(x, axis=0)

print(c2)
[2 1 2]

 axis=1 を指定すると列方向に非ゼロ要素をカウントします。

# CNZ-3

# 行方向に非ゼロ要素を数える
c3 = np.count_nonzero(x, axis=1)

print(c3)
[2 2 1]