在 numpy 数组的末尾附加 n 个数组副本
Posted
技术标签:
【中文标题】在 numpy 数组的末尾附加 n 个数组副本【英文标题】:Append n copies of an array at the end of a numpy array 【发布时间】: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 是任何数组的更一般情况。
【参考方案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
看起来我们的赢家是:创建一个空数组,然后设置元素。这是假设有一定的数组大小,但其中大多数应该类似地缩放。
【讨论】:
以上是关于在 numpy 数组的末尾附加 n 个数组副本的主要内容,如果未能解决你的问题,请参考以下文章