【问题标题】:Adding two arrays of different width using numpy使用numpy添加两个不同宽度的数组
【发布时间】:2012-09-17 16:46:52
【问题描述】:

我正在学习 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

【问题讨论】:

  • 我会写一个小函数,用零填充数组到你想要的大小,这样你就可以总是将等长的数组传递给SigAdd()
  • Padding 可能不起作用例如 2,我已经修改了代码来解决这个问题,但我只是坚持分配。

标签: python numpy


【解决方案1】:

这帮助我解决了类似的问题。这个想法是首先使向量长度相等(最后用 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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      您可以分配给切片:

      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
      

      【讨论】:

      • 谢谢,它工作正常,但你能检查我修改后的代码为什么显示“超出范围的索引错误”。
      • @sarbjit 我认为问题在于这是一个二维数组:y1 = zeros([1,len(n)],int)
      • 你是对的,它是一个二维数组,我只使用一个索引来引用它,修复它。非常感谢。
      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多