【问题标题】:Numpy - summing up a list of vectorsNumpy - 总结向量列表
【发布时间】:2015-12-27 12:21:00
【问题描述】:

我正在尝试对列表中的 NumPy 向量列表求和。 (在这个例子中,它是一个包含 2 个项目的列表,但在我的例子中,该列表可以是任意大小。)如何将它们相加成一个新向量?

a = np.array([100, 100])
b = np.array([200, 200])
my_list = [a, b]

ab = np.add(my_list)

np.add(a, b) 有效,但它不是一个列表。我已经尝试过np.add(*my_list)np.add(np.array(my_list)) 以及np.add(np.array([my_list])),但没有任何成功。这样做的正确方法是什么?谢谢!

【问题讨论】:

    标签: python list numpy vector


    【解决方案1】:

    解决方案 1 np.add.reduce()

    可以使用np.addreduce属性:

    a = np.array([100, 100])
    b = np.array([200, 200])
    c = np.array([1000, 2000])
    L = [a, b, c]
    np.add.reduce(L)
    

    结果:

    array([1300, 2300])
    

    所有接受两个in-arguments的通用函数都有一个reduce属性,像reduce一样应用这个函数,即:

    np.add.reduce(L)
    

    变成:

    np.add(np.add(L[0], L[1]), L[2])
    

    如果列表 L 变大,请添加更多括号和适当的 np.add 调用。

    来自文档:

    文档字符串:

      reduce(a, axis=0, dtype=None, out=None, keepdims=False)
    

    通过沿一个轴应用 ufunc,将a 的维度减少一。

    解决方案 2 np.sum()

    或者,您可以沿第一个轴使用np.sum

    >>> np.sum(L, axis=0)
    array([1300, 2300
    

    性能

    两者的表现似乎是一样的。

    对于小数组:

    a = np.array([100, 100])
    b = np.array([200, 200])
    c = np.array([1000, 2000])
    L = [a, b, c, a, b, c, a, b, c]
    

    reduce 快一点:

    %timeit np.sum(L, axis=0)
    
    10000 loops, best of 3: 20.7 µs per loop
    
    %timeit np.add.reduce(L)
    100000 loops, best of 3: 15.7 µs per loop
    

    对于大型数组:

    size = int(1e6)
    a = np.random.random(size)
    b = np.random.random(size)
    c = np.random.random(size)
    L = [a, b, c, a, b, c, a, b, c]
    

    没有区别:

    %timeit np.sum(L, axis=0)
    10 loops, best of 3: 41.5 ms per loop
    
    %timeit np.add.reduce(L)
    10 loops, best of 3: 41.9 ms per loop
    

    【讨论】:

      【解决方案2】:

      这是你的意思吗?

      import numpy as np
      
      a = np.array([100, 100])
      b = np.array([200, 200])
      my_list = [a, b]
      
      # add them up "vertically"
      
      print np.vstack(my_list).sum(axis=0)
      
      print np.vstack(tuple(my_list)).sum(axis=0)  # I thought it had to be a tuple but apparently not!
      
      
      [300 300]
      [300 300]
      

      【讨论】:

      【解决方案3】:

      您可以使用np.hstacknp.concatenate

      l = [a, b]
      
      In [560]: np.hstack(l)
      Out[560]: array([100, 100, 200, 200])
      
      In [561]: np.concatenate(l)
      Out[561]: array([100, 100, 200, 200])
      

      【讨论】:

      • 这不是求和,而是连接。
      【解决方案4】:

      可能是 reduce 的理想候选者

      >>> a = np.array([100, 100])
      >>> b = np.array([200, 200])
      >>> c = np.array([300, 300])
      >>> reduce(lambda x,y: np.add(x,y), [a,b,c])
      array([600, 600])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        相关资源
        最近更新 更多