2012-06-26 33 views
4

我需要模擬MATLAB函數find,它返回數組非零元素的線性索引。例如:在numpy中獲得線性化索引

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

是否有一個函數給我的線性指標,而不用自己計算它們?

回答

7

numpy的有你覆蓋:

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

內部,它在做什麼斯文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] 
3

最簡單的解決方法是調用nonzero()之前拼合陣列:

>>> a.ravel().nonzero() 
(array([ 0, 15]),) 
1

如果您已經安裝matplotlibmatplotlib.mlab模塊,以及用於與MATLAB兼容其他一些功能可能是已經存在(find即是)。是的,它的實施方式與flatnonzero相同。