向张量添加维度并沿新轴复制值
Add dimensions to a tensor and duplicate values along the new axes
假设我有一个 2D ndarray X
X.shape == (m, n)
我想向 X 添加两个维度,同时沿这些新轴复制值。即我想要
new_X.shape == (m, n, k, l)
并且对于所有 i,j
new_X[i, j, :, :] = X[i, j]
实现此目标的最佳方法是什么?
您可以使用 np.broadcast_to
-
简单地获取张量视图
np.broadcast_to(a[...,None,None],a.shape+(k,l)) # a is input array
好处是没有额外的内存开销,因此实际上是免费的 rumtime。
如果你需要一个有自己内存的数组输出space,附加.copy()
。
样本运行-
In [9]: a = np.random.rand(2,3)
In [10]: k,l = 4,5
In [11]: np.broadcast_to(a[...,None,None],a.shape+(k,l)).shape
Out[11]: (2, 3, 4, 5)
# Verify memory space sharing
In [12]: np.shares_memory(a,np.broadcast_to(a[...,None,None],a.shape+(k,l)))
Out[12]: True
# Verify virtually free runtime
In [17]: a = np.random.rand(100,100)
...: k,l = 100,100
...: %timeit np.broadcast_to(a[...,None,None],a.shape+(k,l))
100000 loops, best of 3: 3.41 µs per loop
假设我有一个 2D ndarray X
X.shape == (m, n)
我想向 X 添加两个维度,同时沿这些新轴复制值。即我想要
new_X.shape == (m, n, k, l)
并且对于所有 i,j
new_X[i, j, :, :] = X[i, j]
实现此目标的最佳方法是什么?
您可以使用 np.broadcast_to
-
np.broadcast_to(a[...,None,None],a.shape+(k,l)) # a is input array
好处是没有额外的内存开销,因此实际上是免费的 rumtime。
如果你需要一个有自己内存的数组输出space,附加.copy()
。
样本运行-
In [9]: a = np.random.rand(2,3)
In [10]: k,l = 4,5
In [11]: np.broadcast_to(a[...,None,None],a.shape+(k,l)).shape
Out[11]: (2, 3, 4, 5)
# Verify memory space sharing
In [12]: np.shares_memory(a,np.broadcast_to(a[...,None,None],a.shape+(k,l)))
Out[12]: True
# Verify virtually free runtime
In [17]: a = np.random.rand(100,100)
...: k,l = 100,100
...: %timeit np.broadcast_to(a[...,None,None],a.shape+(k,l))
100000 loops, best of 3: 3.41 µs per loop