2017-04-07 70 views
-5

我应该转换下面MATLAB的语句在Python:转换MATLAB语句到Python

lam = find(abs(b)>tol,1,'first')-1; 

在此先感谢

+0

这将是有用的,如果你提供一些'实际'b,tol,并显示什么Matlab –

回答

1

NumPy的没有拿到第一个匹配,not yet anyway的能力。

所以,我们需要用np.where取代所有匹配的取代findnumpy.abs将替代abs。因此,这将是 -

import numpy as np 

lam = np.where(np.abs(a)>tol)[0][0]-1 

因此,我们得到的所有匹配指数与np.where(np.abs(a)>tol)[0],然后通过索引到其与np.where(np.abs(a)>tol)[0][0]第一个元素,最后减去它1获得的第一个索引,就像我们在MATLAB 。

采样运行 -

在MATLAB:

>> b = [-4,6,-7,-2,8]; 
>> tol = 6; 
>> find(abs(b)>tol,1,'first')-1 
ans = 
    2 

在NumPy的:

In [23]: a = np.array([-4,6,-7,-2,8]) 

In [24]: tol = 6 

In [25]: np.where(np.abs(a)>tol)[0][0]-1 
Out[25]: 1 # 1 lesser than MATLAB vesion because of 0-based indexing 

出于性能考虑,我建议使用np.argmax给我们的第一个匹配的一个指数,而不是使用np.where(np.abs(a)>tol)[0]来计算所有匹配的索引,像这样 -

In [40]: np.argmax(np.abs(a)>tol)-1 
Out[40]: 1 
+0

'argmax'失败,如果没有第一个元素 – Eric

+0

如果我想要“最后”,而不是“第一”? – Linux

+0

@Linux'np.where(np.abs(a)> tol)[0] [ - 1]'。 – Divakar