python - Numpy 沿新轴重复数组

标签 python numpy multidimensional-array

最好/最高效的方法是什么?

其中 x 是数组,n 是我希望重复的次数:

np.repeat(x[None,...], n, axis=0)

ones = [1] * len(x.shape)
np.tile(x, tuple(n, *ones))

请注意,对于已知的数组大小,后者变得简单:

np.tile(x, (n, 1, 1))  # x is 2D

最佳答案

np.tile 的部分代码是:

for i, nrep in enumerate(tup):
    if nrep!=1:
        c = c.reshape(-1, n).repeat(nrep, 0)

换句话说,它在每个轴上重复超过 1 次重复。实际上,它是重复到多个轴的概括。

所以我希望时间是相似的,尽管简单的 repeat 会有更少的 Python 开销。 repeat 已编译。 (一些简单的测试证实了这一点 - repeat 对于小数组来说快 2 倍,对于大数组来说稍微快一些)。

附: x[None,...] 步骤实际上是无成本的。由于广播,这可能就是您所需要的。

<小时/>

附注有一种更快的方法可以重复执行此操作,即使用 np.lib.index_tricks.as_strided 。对于 (20,50) 形状的 x

as_strided(x,shape=(n,20,50),strides=(0,200,4))

np.broadcast_arrays 也使用 as_strided。所以这会产生相同的结果:

np.broadcast_arrays(np.ones((n,1,1)),x)[1] 

但说实话,这只是广播的阐述,而不是真正的重复。数据尚未被复制。相同的值仅使用 n 次。

广播可用于填充完整数组,但时间与重复相同。这可能就是 repeat 在幕后所做的事情。

z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]

关于python - Numpy 沿新轴重复数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27593024/

相关文章:

c - 具有链表实现的矩阵

javascript - 在 JavaScript 中查找多维 JSON 对象不同级别的重复值

python - 语音识别引擎超时(python 3.7.4)

python - 如何快速对扁平化的 "jagged"numpy 数组重新排序

python - numpy 对角线函数很慢

python - 从图像 numpy 数组中删除透明像素

javascript - 在 Javascript 中镜像 N x N 邻接矩阵的一半

python - Wxpython - 如何在不关闭应用程序的情况下生成一系列文本提示?

python - Flask:连接到 sqlite

python 约束: setting a constraint dependent on a function's output