numpy - 使用 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
(以及它是否是矢量化和/或可矢量化的)。
推荐阅读
- node.js - Send notification to disconnected user using socket io
- html - Bootstrap 4 delete button changed to weird shape after form submit
- android - How to get counts of records based on a column values in a single SQLite query using Room in Android?
- scala - pyspark parent child recursive on same dataframe
- python - How to sample dataframe that results in same distribution from a column in another dataframe
- android - after saving from canvas image looks blurry and image quality is not same as old in flutter
- javascript - How `import` works in a Vue single file component?
- sql - 使用 PostgreSQL 在 Json 中获取一个元素
- pytorch - 如何在 Coral 开发板中安装 PyTorch
- python - 如果需要太长时间,如何在 python 中终止 exec() 函数?