如何创建numpy视图数组?

时间:2016-03-25 07:54:06

标签: python arrays numpy

我有一个形状(3,高度,宽度)的numpy数组的图像,我想创建一个子图像视图。我确切地知道我将拥有多少个子图像,并且可以在周期中创建每个子图像。 这就是我如何做到的:

result_array = np.empty(
    shape=(
        int((res_img.shape[WIDTH] - SUB_IMG_WIDTH + 1) / step * (
            res_img.shape[HEIGHT] - SUB_IMG_HEIGHT + 1) / step),
        SUB_IMG_LAYERS, SUB_IMG_HEIGHT, SUB_IMG_WIDTH),
    dtype=np.dtype(float))

for i in range(0, img.shape[WIDTH] - sub_img_shape[WIDTH], step):
    for ii in range(0, img.shape[HEIGHT] - sub_img_shape[HEIGHT], step):
        result_array[index] = img[:, i:i + sub_img_shape[WIDTH], ii:ii + sub_img_shape[HEIGHT]]

但是我获得了一系列副本而不是视图数组。它本身并不是问题,我不需要修改它们,只需在GPU上同时使用它们,但它会消耗大量的内存:我的图像大小约为1000x600而我大致有10万个子图像。所以我的子图像阵列消耗了3-4 Gb的RAM。 我试图在python列表中存储视图,如:

for i in range(0, img.shape[WIDTH] - sub_img_shape[WIDTH], step):
    for ii in range(0, img.shape[HEIGHT] - sub_img_shape[HEIGHT], step):
        result_array.append(img[:, i:i + sub_img_shape[WIDTH], ii:ii + sub_img_shape[HEIGHT]])

它有效,但我怀疑它是一个好方法。我可以用numpy数组而不是python列表来做任何事情吗?

1 个答案:

答案 0 :(得分:3)

您可以使用as_strided功能执行此操作:

import numpy as np
from numpy.lib.stride_tricks import as_strided
N=10
L=4*N
H=3*N
step=5
a=(np.arange(3*H*L)%256).reshape(3,H,L)    
(k,j,i)=a.strides
b=as_strided (a,shape=(H/step,L/step,3,step,step),strides=(j*step,i*step,k,j,i))

b然后解决每个集团没有副本。

In [29]: np.all(b[1,2]==a[:,5:10,10:15])
Out[29]: True

In [30]: a[:,5,10]=0  # modification of a

In [31]: np.all(b[1,2]==a[:,5:10,10:15])
Out[31]: True  # b also modified