簡體   English   中英

MATLAB中“過濾器”的等效Python函數是什么?

[英]What is the equivalent Python function for “filter” in MATLAB?

我想在MATLAB中的向量上應用filter函數。

在Python中,我這樣寫:

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

如何在MATLAB中編寫此代碼?

MATLAB中最接近的等效項是使用logical索引來過濾掉不需要的元素:

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

Python中的filter所做的是,給定您為列表中每個元素指定的謂詞的評估結果為True ,它將返回另一個列表。 從列表中刪除所有為False元素。 同樣,在MATLAB中,您可以使用logical索引直接索引到數組中,從而為您提供相同的東西。


那么l2 = l(l > 2);到底是什么l2 = l(l > 2); 做? 基本上, l > 2會為您提供TrueFalse數組,其大小與l相同。 在MATLAB中將如下所示:

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

l =

     1     2     3     4

>> l > 2

ans =

     0     0     1     1

如您所見, l > 2返回與l大小相同的logical向量。 這里顯示的是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中已經存在的函數,它是Signal Processing Toolbox的一部分。 將此保存到名為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

擴展@rayryeng的示例( 獎勵 )答案:

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

這個想法可以擴展到二維數組中的整個數據行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM