4

find配列の非ゼロ要素の線形インデックスを返すMATLAB 関数 をエミュレートする必要があります。例えば:

>> a = zeros(4,4)
a =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
>> a(1,1) = 1
>> a(4,4) = 1
>> find(a)
ans =

     1
    16

numpy にも同様の関数nonzeroがありますが、インデックス配列のタプルを返します。例えば:

In [1]: from numpy import *
In [2]: a = zeros((4,4))

In [3]: a[0,0] = 1

In [4]: a[3,3] = 1

In [5]: a
Out[5]: 
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.]])

In [6]: nonzero(a)
Out[6]: (array([0, 3]), array([0, 3]))

自分で計算せずに線形インデックスを与える関数はありますか?

4

3 に答える 3

7

numpy はあなたをカバーしました:

>>> np.flatnonzero(a)
array([ 0, 15])

内部的には、Sven Marnach が提案したこととまったく同じです。

>>> print inspect.getsource(np.flatnonzero)
def flatnonzero(a):
    """
    Return indices that are non-zero in the flattened version of a.

    This is equivalent to a.ravel().nonzero()[0].

    [more documentation]

    """
    return a.ravel().nonzero()[0]
于 2012-06-26T17:52:02.133 に答える
3

最も簡単な解決策は、呼び出す前に配列をフラット化することnonzero()です。

>>> a.ravel().nonzero()
(array([ 0, 15]),)
于 2012-06-26T14:54:38.587 に答える
1

インストールしている場合は、モジュール内にmatplotlib既に存在する可能性があります (findつまりmatplotlib.mlab、matlab との互換性を目的としたその他の関数と同様)。はい、それは と同じ方法で実装されていflatnonzeroます。

于 2012-06-26T18:12:04.857 に答える