在 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 的末尾附加nB 副本:

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

请注意,这仅适用于小型数组,appendhstackconcatenate 应该是渐近收敛的,因为所有这些函数都调用 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 个数组副本的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习(四十七)NumPy 副本和视图

带副本的 Numpy 数组赋值

Numpy | 20 副本和视图

何时获取 numpy 数组的子矩阵返回视图但不返回副本?

np.append()

创建数组X,并在python中为数组Y中的每个元素提供一定数量的副本