2014-02-20 123 views
1

让A和B成为两个numpy数组。在numpy数组的末尾追加数组的n个副本

我想在A年底追加的Bn副本:

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

+0

*备注*:事实上,在我的代码B中是A('B = A [-1000:]')的视图,但我认为这不是重要的,它应该在更一般的情况下工作其中B是任​​何阵列。 – Basj

回答

1

看样子你想使用tile()

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

首先让检查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 

请注意,这只是针对小数组,appendhstack的情况下,和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 

貌似我们的获奖者是:创建一个空数组,然后设置元素。这是假设一个特定的数组大小,但其中大部分应该相似地缩放。