【问题标题】:Append n copies of an array at the end of a numpy array在 numpy 数组的末尾附加 n 个数组副本
【发布时间】:2014-03-22 05:52:16
【问题描述】:

令 A 和 B 为两个 numpy 数组。

我想在A 的末尾附加n 的B 副本:

C = [A, B, B, B, ... (n times) ... B, B]

如何使用numpy 简单/高效地做到这一点?

类似

numpy.append(A, [B * n])        # B * n  is not n copies of B,
                                #      but rather B multiplied by constant n ?

或者numpy.concatenate?

【问题讨论】:

  • Remark :实际上在我的代码中 B 是来自 A 的视图 (B = A[-1000:] ) 但我认为这在这里并不重要,它应该在B 是任何数组的更一般情况。

标签: python arrays numpy append


【解决方案1】:

您似乎想使用tile()

C = np.concatenate((A, np.tile(B,n)))

【讨论】:

    【解决方案2】:

    首先让我们看看concatenate 例程:

    A = np.arange(1E4)
    #Baseline
    %timeit np.concatenate((A,A))
    100000 loops, best of 3: 11.1 µs per loop
    
    %timeit np.hstack((A,A))
    10000 loops, best of 3: 20.9 µs per loop
    
    %timeit np.append(A,A)
    100000 loops, best of 3: 19 µs per loop
    

    请注意,这仅适用于小型数组,append、hstack 和 concatenate 应该是渐近收敛的,因为所有这些函数都调用 concatenate,主要区别在于 python 开销。现在唯一的问题是如何创建数组B:

    #Using python
    %timeit np.concatenate((A,[5]*10000))
    1000 loops, best of 3: 1.1 ms per loop
    
    #Tile small array
    %timeit C = np.concatenate((A, np.tile(np.array(5),1E4)))
    10000 loops, best of 3: 92.1 µs per loop
    
    #Create an array of ones and multiply by a number
    %timeit np.concatenate((A,np.ones(1E4)*5))
    10000 loops, best of 3: 39.5 µs per loop
    
    #Create empty array and fill from A and then set
    %timeit C = np.empty(2E4); C[:10000]=A; C[10000:]=5
    100000 loops, best of 3: 16.8 µs per loop
    

    看起来我们的赢家是:创建一个空数组,然后设置元素。这是假设有一定的数组大小,但其中大多数应该类似地缩放。

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2017-03-03
      • 2021-04-24
      • 2020-10-01
      • 1970-01-01
      • 2020-10-14
      • 2017-09-02
      相关资源
      最近更新 更多