什么是" filter"的等效Python函数。在MATLAB?

时间:2015-09-16 02:40:38

标签: python matlab

我想在MATLAB中对矢量应用l = [1,2,3,4] l2 = filter(lambda x:x>2,l) 函数。

在Python中我写道:

child_process

我如何在MATLAB中写这个?

2 个答案:

答案 0 :(得分:1)

MATLAB中最接近的等价物是使用logical索引来过滤掉你不需要的元素:

l = [1,2,3,4];
l2 = l(l > 2);

Python中filter的作用是,它返回另一个列表,因为您为列表中的每个元素指定的谓词的计算结果为True。从列表中删除False的所有元素。同样,在MATLAB中,您可以直接索引到具有logical索引的数组,以便为​​您提供相同的功能。

那么l2 = l(l > 2);究竟做了什么?基本上,l > 2为您提供了与True大小相同的Falsel数组。它将在MATLAB中看起来像这样:

>> l = [1,2,3,4]

l =

     1     2     3     4

>> l > 2

ans =

     0     0     1     1

如您所见,l > 2会返回与logical大小相同的l向量。这里显示的是l的每个值是否满足它的大于2的谓词。正如预期的那样,前两个元素是False,而后两个元素是True 。通过将此logical向量用作向量l的输入,您建立索引,以便在此向量中等于True的任何位置,相应的位置选中l,而False的位置被滤除。因此,前两个元素被删除,因为它们是False,而最后两个元素保留,因为这些元素位于True

因此,执行l2 = l(l > 2);会给出:

>> l2 = l(l > 2)

l2 =

     3     4

从Steve Eddins的博客中了解logical索引的更多信息:http://blogs.mathworks.com/steve/2008/01/28/logical-indexing/

加成

但是,如果你真的想使用filter范例,你可以定义一个可以这样做的函数:

function out = filter_python(in, func)
    out = in(func(in));
end

这不会进行错误检查,您需要确保func是一个接受向量的函数,并且输出也是一个与输入向量in大小相同的向量。该函数还需要为输入向量中的每个元素返回True/False

请注意,我正在调用此filter_python,因为filter是MATLAB中已存在的函数,它是信号处理工具箱的一部分。将其保存到名为filter_python.m的文件中。既然你已经完成了,你就这样称呼它:

l = [1,2,3,4];
l2 = filter_python(l, @(x) x > 2);

@(x)是一个匿名函数,很像lambda x在Python中。

作为奖励,在IPython中,这就是我们得到的:

In [13]: %paste
l = [1,2,3,4]
l2 = filter(lambda x:x>2,l)

## -- End pasted text --

In [14]: l
Out[14]: [1, 2, 3, 4]

In [15]: l2
Out[15]: [3, 4]

....在MATLAB中(如前所示):

>> l = [1,2,3,4];
>> l2 = l(l > 2);
>> l2

l2 =

     3     4

与自定义功能类似:

>> l = [1,2,3,4];
>> l2 = filter_python(l, @(x) x > 2);
>> l2

l2 =

     3     4

答案 1 :(得分:0)

扩展@rayryeng的示例(奖励)答案:

  
function out = filter_python(in, func)
    out = in(func(in));
end
  

这个想法可以扩展到2D数组中的整行数据。

function out = filtrow(func,in,colnum)
if nargin == 2
   colnum=0;
   sz = size(in);
   if sz(1)==1 || sz(2)==1
      out = in(func(in));
      return
   else
      out = in;
      for i = sz(2):-1:1
          out = out(func(out(:,i)),:);
      end
   end
end
if nargin == 3
  out = in(func(in(:,colnum)),:);
end

或者如果你喜欢cols。

  function out = filtcol(func,in,rownum)
  if nargin == 2
    rownum=0;
    sz = size(in);
    if sz(1)==1 || sz(2)==1
        out = in(func(in));
        return
    else
        out = in';
        for i = sz(2):-1:1
            out = out(func(out(:,i)),:);
        end
        out = out';
    end
  end
  if nargin == 3
    out = in';
    out = out(func(out(:,rownum)),:);
    out = out';
  end

所以给定矩阵A:

 A =

     0    0.4694    0.1656    0.0838    0.0782    0.8687    0.1818
0.0540         0    0.6020    0.2290    0.4427    0.0844    0.2638
0.5308    0.3371         0    0.9133    0.1067    0.3998    0.1455
0.7792    0.1622    0.6541         0    0.9619    0.2599    0.1361
0.9340    0.7943    0.6892    0.8258    0.0046    0.8001    0.8693
0.1299    0.3112    0.7482    0.5383    0.7749    0.4314    0.5797
0.5688    0.5285    0.4505    0.9961    0.8173    0.9106    0.5499

#%%% We can also remove entire rows or cols by this method
#%%% here we use filtrow to remove rows where elements do no pass the c condition function

>> out = filtrow(@(x) x>0,A)

out =

0.9340    0.7943    0.6892    0.8258    0.0046    0.8001    0.8693
0.1299    0.3112    0.7482    0.5383    0.7749    0.4314    0.5797
0.5688    0.5285    0.4505    0.9961    0.8173    0.9106    0.5499


#%%% Or we can do the same to remove the cols

>> out = filtcol(@(x) x>0,A)

out =

0.0782    0.8687    0.1818
0.4427    0.0844    0.2638
0.1067    0.3998    0.1455
0.9619    0.2599    0.1361
0.0046    0.8001    0.8693
0.7749    0.4314    0.5797
0.8173    0.9106    0.5499

#%%%Or you could filter by individual rows

>> out = filtrow(@(x) x>0,A,1)

out = 

0.0540         0    0.6020    0.2290    0.4427    0.0844    0.2638
0.5308    0.3371         0    0.9133    0.1067    0.3998    0.1455
0.7792    0.1622    0.6541         0    0.9619    0.2599    0.1361
0.9340    0.7943    0.6892    0.8258    0.0046    0.8001    0.8693
0.1299    0.3112    0.7482    0.5383    0.7749    0.4314    0.5797
0.5688    0.5285    0.4505    0.9961    0.8173    0.9106    0.5499