2

我正在学习 Numpy 作为 Matlab 的替代品。我在将 Matlab 函数映射到 Numpy 时遇到问题。程序是用matlab把两个信号相加

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]

如果两个数组长度相等,它可以正常工作,但不适用于不相等的数组。我知道问题是我正在用 x1 的值覆盖 y1(我最初用零创建)导致问题。我在 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
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 回答
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
于 2014-08-06T15:27:14.763 回答