4

我需要模拟 MATLAB 函数find,它返回数组非零元素的线性索引。例如:

>> 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 回答