首页 > 解决方案 > 如何制作重复的“numpy”数组视图

问题描述

如何将numpy数组切片超出其形状,以便重复数组中的值而不必将整个数组存储在内存中?这是我想做的:

x = numpy.array([[1, 2], [3, 4]])
x[0:3, 0:3]
->
[[1, 2, 1, 2],
 [3, 4, 3, 4],
 [1, 2, 1, 2],
 [3, 4, 3, 4]]

我知道,numpy.repeat但是numpy.tile这两个都制作了数组的副本,我想对数组进行切片,x[1238123:1238143,5328932:5328941]而不需要制作数百万个较小数组的副本。

标签: pythonarraysnumpynumpy-slicing

解决方案


通过strides技巧,我们可以制作 4d 视图:

In [18]: x = numpy.array([[1, 2], [3, 4]])
In [19]: as_strided = np.lib.stride_tricks.as_strided
In [20]: X = as_strided(x, shape=(2,2,2,2), strides=(0,16,0,8))
In [21]: X
Out[21]: 
array([[[[1, 2],
         [1, 2]],

        [[3, 4],
         [3, 4]]],


       [[[1, 2],
         [1, 2]],

        [[3, 4],
         [3, 4]]]])

可以将其重塑为您想要的数组:

In [22]: X.reshape(4,4)
Out[22]: 
array([[1, 2, 1, 2],
       [3, 4, 3, 4],
       [1, 2, 1, 2],
       [3, 4, 3, 4]])

但是这种重塑会创建一个X.

该 (2,2) 数组可以在计算中用作 (1,1,2,2) 数组,如果需要,可以将其扩展为 (2,2,2,2):

In [25]: x[None,None,:,:]
Out[25]: 
array([[[[1, 2],
         [3, 4]]]])
In [26]: np.broadcast_to(x,(2,2,2,2))
Out[26]: 
array([[[[1, 2],
         [3, 4]],

        [[1, 2],
         [3, 4]]],


       [[[1, 2],
         [3, 4]],

        [[1, 2],
         [3, 4]]]])

因此,广播让我们可以在更大的计算中使用数组视图。


推荐阅读