![](/img/trans.png)
[英]What is the python equivalent of roipoly matlab function?
[英]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
會為您提供True
和False
數組,其大小與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.