NumPy 非ゼロ要素のインデクスとカウント
NumPy 配列のゼロではない要素のインデクスや数え上げに関連する関数の一覧です。
numpy.nonzero()
numpy.nonzero() は配列の非ゼロ要素のインデクス配列をタプルで返します。
# NUMPY_NONZERO
# In[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 種類のインデクス配列を組合わせれば、非ゼロ要素を指定することができます。すなわち、
が非ゼロ要素の 2 次元インデクスとなっています。したがって、numpy.nonzero() で取得したインデクス配列を使えば、もとの配列の非ゼロ要素を抽出することができます。
# In[2]
# xから非ゼロ要素を抽出
print(x[a])
[5 1 3 8]
numpy.flatnonzero()
numpy.flatnonzero() は受け取った配列をフラットにして、非ゼロ要素のインデクスを返します。
# NUMPY_FLATNONZERO
# In[1]
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]
numpy.count_nonzero()
numpy.count_nonzero() は非ゼロ要素を数えます。
# NUMPY_COUNT_NONZERO
# In[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 を指定すると列方向に非ゼロ要素をカウントします。
# In[2]
# 列方向に非ゼロ要素を数える
c2 = np.count_nonzero(x, axis=0)
print(c2)
[2 1 2]
axis=1 を指定すると行方向に非ゼロ要素をカウントします。
# In[3]
# 行方向に非ゼロ要素を数える
c3 = np.count_nonzero(x, axis=1)
print(c3)
[2 2 1]
下記は誤植と思われますので、ご確認ください。
In[2] プログラムの上の文で、axis=0 を指定すると行方向 → axis=0 を指定すると列方向
In[2] プログラムのコメントで、# 行方向に非ゼロ → # 列方向に非ゼロ
In[3] プログラムの上の文で、axis=1 を指定すると列方向 → axis=1 を指定すると行方向
直しておきました。
ありがとうございます。m(_ _)m