2012-09-26 6 views
2

나는 Matlab 대신 Numpy를 배우고 있습니다. Numpy에 Matlab 함수 매핑 문제가 있습니다. 프로그램은 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; 

:

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] 
,451,515,

예 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] 

이 두 배열이 동일한 길이의 경우 잘 작동하지만 동일하지 않은 배열에 대해 작동하지 않습니다. 난 문제가 내가 문제를 일으키는 x1의 가치와 (처음에 0으로 만든) y1을 무시 오전 알아요. Matlab의 Find 명령과 동일한 Numpy에서 argwhere 명령을 사용했지만 위의 Matlab 프로그램과 같이 사용하면 호출 가능한 함수에 값을 할당 할 수 없다는 오류가 표시됩니다.

기본적으로 Matlab 프로그램에서 동일하지 않은 배열은 0으로 채워집니다. 두 신호의 길이가 같지만 위치가 다른 경우에도 MATLAB 버전은 조건을 처리합니다. 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

나는') (당신이 원하는 크기 제로 배열을 채 웁니다 조금 함수를 작성한다. –

+0

padding이 example2에서 작동하지 않을 수 있습니다.이 문제를 해결하기 위해 코드가 수정되었지만 할당이 막혔습니다. – 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 문제는 ​​이것이 2 차원 배열이라는 것입니다 :'y1 = 0 ([1, len (n)], int)' –

+0

맞아요, 2 차원 배열이고, 그것을 참조하는 단 하나의 색인. 고마워. – 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을 채우는 것이 더 짧음). 단점은 목록으로의 변환과 그 목록으로 인한 메모리 오버 헤드입니다. 그러나 빠르고 더러운 작업을 위해 잘 작동했습니다. 당신은 항상 SigAdd`에 같은 길이의 배열을 통과 할 수 있도록

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 
관련 문제