スパース行列 (numpy.array) があり、その中にゼロ以外の要素のインデックスが必要です。
Matlab では、次のように記述します。
[i, j] = find(CM)
そしてPythonで私は何をすべきですか? numpy.nonzero (ただし、そこからインデックスを取得する方法がわかりません) と flatnonzero (ただし、私にとっては便利ではありません。行インデックスと列インデックスの両方が必要です) を試しました。
前もって感謝します!
「スパース行列」とは、実際には行列を意味するのではなく、ゼロ以外のエントリが比較的少ないscipy.sparse
だけであると仮定すると、まさにあなたが探しているものだと思います。配列から開始:numpy.ndarray
nonzero
>>> a = (np.random.random((5,5)) < 0.10)*1
>>> a
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
nonzero
ゼロ以外のエントリが存在するインデックス (ここでは x と y) を返します。
>>> a.nonzero()
(array([1, 2, 3]), array([4, 2, 0]))
これらをi
およびに割り当てることができj
ます。
>>> i, j = a.nonzero()
それらを使用して にインデックスを戻すこともできます。これにより、 sa
のみが得られます。1
>>> a[i,j]
array([1, 1, 1])
a
これらのインデックスを使用して変更することもできます。
>>> a[i,j] = 2
>>> a
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 2],
[0, 0, 2, 0, 0],
[2, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
インデックスから結合された配列が必要な場合は、それも行うことができます。
>>> np.array(a.nonzero()).T
array([[1, 4],
[2, 2],
[3, 0]])
(この再形成を行うには多くの方法があります。私はほぼ無作為に 1 つを選びました。)
これはあなたのことを少し超えています。私はかつて同様の問題に直面したので、それについて言及するだけです. インデックスで他の配列にアクセスする場合は、非常に単純な構文があります。
import numpy as np
array = np.random.randint(0, 2, size=(3, 3))
data = np.random.random(size=(3, 3))
配列は次のようになります
>>> print array
array([[0, 1, 0],
[1, 0, 1],
[1, 1, 0]])
データは
>>> print data
array([[ 0.92824816, 0.43605604, 0.16627849],
[ 0.00301434, 0.94342538, 0.95297402],
[ 0.32665135, 0.03504204, 0.86902492]])
次に、ゼロである data の要素が必要な場合:
>>> print data[array==0]
array([ 0.92824816, 0.16627849, 0.94342538, 0.86902492])
これは素晴らしくシンプルです。