使用 as_strided 沿给定轴重复
Repeat along given axis with as_strided
我有一个 numpy 数组:
a = array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
我用 np.repeat
像那样复制:
np.repeat(a, 3, axis=0)
结果:
array([[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.],
[3., 4., 5.],
[3., 4., 5.],
[3., 4., 5.],
[6., 7., 8.],
[6., 7., 8.],
[6., 7., 8.]])
我可以用 np.lib.stride_tricks.as_strided
实现同样的效果以避免复制数据吗?对于多维数组,我也需要类似的东西,但我总是沿着第 0 轴重复...
我认为这是不可能的。你可以近距离接触:
n=3
out = np.lib.stride_tricks.as_strided(a,
shape = (n,) + a.shape,
strides = (0,) + a.strides
)
np.shares_memory(a, out)
Out[]: True
out
Out[]:
array([[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]],
[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]],
[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]]])
但这不是在维度 0 中重复,而是在新的维度 0 中重复所有内容。重塑会创建一个副本:
out.reshape(-1, 3)
Out[]:
array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.],
[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.],
[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
np.shares_memory(a, out.reshape(-1, 3))
Out[]: False
通常情况下,使用广播会更好,例如:
op(a_repeated, b)
至:
op(a[None, ...], b.reshape((-1, a.shape[0]) + b.shape[1:])) )
但这在很大程度上取决于 op
是什么(以及它是否矢量化 and/or 可矢量化)。
我有一个 numpy 数组:
a = array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
我用 np.repeat
像那样复制:
np.repeat(a, 3, axis=0)
结果:
array([[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.],
[3., 4., 5.],
[3., 4., 5.],
[3., 4., 5.],
[6., 7., 8.],
[6., 7., 8.],
[6., 7., 8.]])
我可以用 np.lib.stride_tricks.as_strided
实现同样的效果以避免复制数据吗?对于多维数组,我也需要类似的东西,但我总是沿着第 0 轴重复...
我认为这是不可能的。你可以近距离接触:
n=3
out = np.lib.stride_tricks.as_strided(a,
shape = (n,) + a.shape,
strides = (0,) + a.strides
)
np.shares_memory(a, out)
Out[]: True
out
Out[]:
array([[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]],
[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]],
[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]]])
但这不是在维度 0 中重复,而是在新的维度 0 中重复所有内容。重塑会创建一个副本:
out.reshape(-1, 3)
Out[]:
array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.],
[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.],
[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
np.shares_memory(a, out.reshape(-1, 3))
Out[]: False
通常情况下,使用广播会更好,例如:
op(a_repeated, b)
至:
op(a[None, ...], b.reshape((-1, a.shape[0]) + b.shape[1:])) )
但这在很大程度上取决于 op
是什么(以及它是否矢量化 and/or 可矢量化)。