此问题之前已被问过,但该解决方案仅适用于1D / 2D阵列,我需要更一般的答案。
如何在不复制数据的情况下创建重复数组?这让我感到非常普遍,因为它有助于在没有内存命中的情况下对python操作进行矢量化。
更具体地说,我有一个(y,x)数组,我想多次平铺以创建(z,y,x)数组。我可以用numpy.tile(数组,(nz,1,1))来做这个,但是我的内存不足。我的具体情况是x = 1500,y = 2000,z = 700。
答案 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
)