我正在學習Numpy作爲Matlab的替代品。我有問題映射Matlab函數到Numpy。計劃是增加利用Matlab使用numpy添加兩個不同寬度的數組
兩個信號Matlab的版本:
function [y.d = sigadd(xl,nl,x2,n2)
% implements y(n) = xi(n)+x2(n)
% [y,nl - sigadd(xi,nl,x2,n2)
X
% xi = first sequence over nl
% x2 - second sequence over n2 (n2 can be different from nl)
%
n = min(min(n1) ,min(n2)) :max(max(nl) ,max(n2)) ; X duration of y(n)
yl - zeros(l,length(n)); y2 = yl;
yl(find((n>=min(nl))&(n<cmar(nl))-l))lxl;
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;
y = yl+y2;
我曾嘗試在Python如下:
def SigAdd(x1,n1,x2,n2):
n_l = min(min(n1),min(n2))
n_h= max(max(n1),max(n2))
n = arange(n_l,n_h+1)
y1 = zeros([1,len(n)],int)
y2 = y1
y1 = (argwhere((n>=min(n1))&(n<=max(n1)))==1)
y1 = x1
y2 = (argwhere((n>=min(n2))&(n<=max(n2)))==1)
y2 = x2
y = y1 + y2
return y,n
預期結果:
例1:不等長的陣列
x1 = array([1,1,1,1,1])
x2 = array([1,1,1,1])
n1 = array([1,2,3,4,5])
n2 = array([1,2,3,4])
y,n = SigAdd(x1,n1,x2,n2)
>> y
array[2,2,2,2,1]
>>n
array[1,2,3,4,5]
例2:長度相等的陣列
x1 = array([1,1,1])
x2 = array([1,1,1])
n1 = array([1,2,3])
n2 = array([3,4,5])
y,n = SigAdd(x1,n1,x2,n2)
>> y
array[1,1,2,1,1]
>>n
array[1,2,3,4,5]
如果兩個數組長度相等的它工作正常,但不會對不平等的數組。我知道問題是我重寫了y1(我最初用零創建)與值的x1導致問題。我在Numpy中使用了argwhere命令,它相當於Matlab的Find命令,但是如果我像上面顯示的Matlab程序那樣使用它,它會顯示錯誤,該值不能分配給可調用函數。
基本上在Matlab程序中,不相等的數組填充零。即使兩個信號的長度相同但位於不同位置,Matlab版本也可處理條件。我想使用Python而不是Matlab,但是這些轉換問題正在導致痛苦。
一些修改:(但不工作,索引錯誤:出界到來的)
def SigAdd(x1,n1,x2,n2):
n_l = min(min(n1),min(n2))
n_h= max(max(n1),max(n2))
n = arange(n_l,n_h+1)
y1 = zeros([1,len(n)],int)
y2 = y1
y11 = argwhere((n>=min(n1))&(n<=max(n1)))
q = 0
for w in y11:
y1[w]= x1[q]
q = q + 1
y22 = argwhere((n>=min(n2))&(n<=max(n2)))
q = 0
for w in y22:
y2[w]= x2[q]
q = q + 1
y = y1 + y2
return y
我會寫一個小數函數,用零填充所需大小的數組,以便始終可以將相等長度的數組傳遞給'SigAdd()'。 –
填充可能無法爲example2,我已修改代碼來解決這個問題,但我只是堅持賦值。 – sarbjit