1

スパース行列 (numpy.array) があり、その中にゼロ以外の要素のインデックスが必要です。

Matlab では、次のように記述します。

[i, j] = find(CM)

そしてPythonで私は何をすべきですか? numpy.nonzero (ただし、そこからインデックスを取得する方法がわかりません) と flatnonzero (ただし、私にとっては便利ではありません。行インデックスと列インデックスの両方が必要です) を試しました。

前もって感謝します!

4

2 に答える 2

3

「スパース行列」とは、実際には行列を意味するのではなく、ゼロ以外のエントリが比較的少ないscipy.sparseだけであると仮定すると、まさにあなたが探しているものだと思います。配列から開始:numpy.ndarraynonzero

>>> 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 つを選びました。)

于 2013-09-26T15:46:32.363 に答える
0

これはあなたのことを少し超えています。私はかつて同様の問題に直面したので、それについて言及するだけです. インデックスで他の配列にアクセスする場合は、非常に単純な構文があります。

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])

これは素晴らしくシンプルです。

于 2013-09-26T15:57:12.027 に答える