Matlab 用numpy求线性化指标

Matlab 用numpy求线性化指标,matlab,numpy,Matlab,Numpy,我需要模拟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 In [

我需要模拟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
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]))
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
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]))

是否有一个函数可以在不亲自计算的情况下为我提供线性索引?

最简单的解决方案是在调用
nonzero()之前展平数组:

numpy是否涵盖了:

>>> np.flatnonzero(a)
array([ 0, 15])
在内部,它正按照斯文·马纳奇的建议行事

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

如果您安装了
matplotlib
,它可能已经存在于
matplotlib.mlab
模块中(
find
),以及其他一些与matlab兼容的函数。是的,它的实现方式与
flatnonzero
相同