python - 如何制作重复的“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]
而不需要制作数百万个较小数组的副本。
解决方案
通过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]]]])
因此,广播让我们可以在更大的计算中使用数组视图。