2012-09-26 45 views
2

我正在學習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 
+0

我會寫一個小數函數,用零填充所需大小的數組,以便始終可以將相等長度的數組傳遞給'SigAdd()'。 –

+0

填充可能無法爲exa​​mple2,我已修改代碼來解決這個問題,但我只是堅持賦值。 – sarbjit

回答

2

您可以分配到切片:

def SigAdd(x1,n1,x2,n2): 
    n_l = min(n1[0], n2[0]) 
    n_h = max(n1[-1], n2[-1]) 
    n = arange(n_l, n_h+1) 
    y = zeros(len(n), int) 
    i = n1[0] - n[0] 
    y[i:i+len(x1)] = x1 
    i = n2[0] - n[0] 
    y[i:i+len(x2)] += x2 
    return y 
+0

Thx,它正在工作,但您能否請您檢查我的修改代碼顯示「出界索引錯誤」的原因。 – sarbjit

+0

@sarbjit我認爲問題是這是一個二維數組:'y1 = zeros([1,len(n)],int)' –

+0

你是對的,這是一個二維數組,我正在使用只是一個索引來引用它,修復它。非常感謝。 – sarbjit

1

使用花哨的索引:

import numpy as np 
high = max(n2[-1], n1[-1]) 
low = min(n2[0], n1[0]) 
n1_ = n1 - low # use 0-based indexing 
n2_ = n2 - low 
y = np.zeros(high - low + 1, dtype=x1.dtype) 
y[n1_] += x1 
y[n2_] += x2 
0

這幫了我一個類似的問題。這個想法是首先使矢量長度相等(末尾填充的長度爲0)。缺點是轉換爲列表以及這些列表的內存開銷。然而,對於快速和骯髒的任務來說,它的效果很好

def MakeVectorsSameSize(v1,v2): 
    """given two vectors zero pad smaller to match length of bigger""" 
    #make the vectors length of longest 0 pad 
    l1 = len(v1) 
    l2 = len(v2) 
    if l1 < l2: 
    #put l2-l1 elements into v1 
    z1 = numpy.ones(l2-l1)*0 
    v1 = list(v1) 
    v1.extend(z1) 
    v1 = numpy.array(v1) 
    elif l1 > l2: 
    #put l1-l2 elements into v2 
    z2 = numpy.ones(l1-l2)*0 
    v2 = list(v2) 
    v2.extend(z2) 
    v2 = numpy.array(vTemp) 

    return v1,v2