2

Matlabの代わりにNumpyを学んでいます。Matlab関数をNumpyにマッピングする際に問題が発生しました。プログラムは、Matlabを使用して2つの信号を追加することです

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でMatlabのFindコマンドに相当するargwhereコマンドを使用しましたが、上記のMatlabプログラムのように使用すると、呼び出し可能な関数に値を割り当てることができないというエラーが表示されます。

基本的にMatlabプログラムでは、等しくない配列はゼロで埋められます。Matlabバージョンは、2つの信号の長さが同じで、位置が異なる場合でも条件を処理します。Matlabの代わりに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
    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
4

3 に答える 3

4

スライスに割り当てることができます:

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
于 2012-09-26T06:26:20.787 に答える
2

ファンシー インデックスの使用:

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
于 2012-09-26T06:34:10.643 に答える