创建这种广义对角线视图的一种方法是使用as_strided
模块中的函数numpy.lib.stride_tricks
。与两个轴的对角线关联的轴的步幅是这些轴的步幅之和。
例如:
In [196]: from numpy.lib.stride_tricks import as_strided
创建形状为 (7, 3, 7, 3) 的数组:
In [197]: a = np.arange(21*21).reshape(7,3,7,3)
In [198]: a[5, :, 5, :]
Out[198]:
array([[330, 331, 332],
[351, 352, 353],
[372, 373, 374]])
创建与轴 0 和 2 关联的“对角线”视图。该视图的形状为 (3, 3, 7):
In [199]: d = as_strided(a, strides=(a.strides[1], a.strides[3], a.strides[0] + a.strides[2]), shape=(3, 3, 7))
检查,例如,d[:, :, 5]
是相同的a[5, :, 5, :]
:
In [200]: d[:, :, 5]
Out[200]:
array([[330, 331, 332],
[351, 352, 353],
[372, 373, 374]])
验证一下d
是一个视图a
通过修改d
看到这一点a
已经改变:
In [201]: d[1, 1, 5] = -1
In [202]: a[5, :, 5, :]
Out[202]:
array([[330, 331, 332],
[351, -1, 353],
[372, 373, 374]])
小心as_strided
!如果参数错误,可以写入外部内存a
,可能导致 python 崩溃。