python - 重复numpy数组而不复制数据

时间:2014-05-16 13:09:11

标签: python numpy memory large-data

此问题之前已被问过,但该解决方案仅适用于1D / 2D阵列,我需要更一般的答案。

如何在不复制数据的情况下创建重复数组?这让我感到非常普遍,因为它有助于在没有内存命中的情况下对python操作进行矢量化。

更具体地说,我有一个(y,x)数组,我想多次平铺以创建(z,y,x)数组。我可以用numpy.tile(数组,(nz,1,1))来做这个,但是我的内存不足。我的具体情况是x = 1500,y = 2000,z = 700。

1 个答案:

答案 0 :(得分:4)

一个简单的诀窍是使用np.broadcast_arrays在第一维中对(x, y) - 长向量广播z

import numpy as np

M = np.arange(1500*2000).reshape(1500, 2000)
z = np.zeros(700)

# broadcasting over the first dimension
_, M_broadcast = np.broadcast_arrays(z[:, None, None], M[None, ...])

print M_broadcast.shape, M_broadcast.flags.owndata
# (700, 1500, 2000), False

要概括this answer中为一维数组提供的stride_tricks方法,您只需要为输出数组的每个维度包含形状和步长:

M_strided = np.lib.stride_tricks.as_strided(
                M,                              # input array
                (700, M.shape[0], M.shape[1]),  # output dimensions
                (0, M.strides[0], M.strides[1]) # stride length in bytes
            )