Numpy/PyTorch 局部平铺方法
Numpy/PyTorch method for partial tiling
我好像记得遇到过类似numpy.tile
的Numpy或PyTorch方法,只是它允许部分平铺达到指定的尺寸。所以如果我有
a = np.array([[5, 6, 7, 8],
[1, 2, 3, 4]])
(或者,相应地,t = torch.Tensor(a)
如果这是 PyTorch 方法),
然后
a.mystery_method((3,4))
会产生输出
array([[5, 6, 7, 8],
[1, 2, 3, 4],
[5, 6, 7, 8]])
不幸的是,我现在无法在 Numpy 或 Pytorch 文档中找到此方法。它是否真的存在,如果存在它是什么?
您可以使用 np.resize
-
M = 3 # number of rows for output
np.resize(a,(M,a.shape[1]))
使用 np.take
的另一种方式或简单地沿第一轴索引以提高性能 -
np.take(a,np.arange(M)%a.shape[0],axis=0) # with np.take
a[np.arange(M)%a.shape[0]] # with indexing
运行时测试 -
In [91]: a = np.random.randint(0,9,(2000,4000))
In [92]: M = 3000
In [93]: %timeit np.resize(a,(M,a.shape[1]))
10 loops, best of 3: 24.1 ms per loop
In [94]: %timeit np.take(a,np.arange(M)%a.shape[0],axis=0)
100 loops, best of 3: 16.2 ms per loop
In [95]: %timeit a[np.arange(M)%a.shape[0]]
100 loops, best of 3: 15.2 ms per loop
我好像记得遇到过类似numpy.tile
的Numpy或PyTorch方法,只是它允许部分平铺达到指定的尺寸。所以如果我有
a = np.array([[5, 6, 7, 8],
[1, 2, 3, 4]])
(或者,相应地,t = torch.Tensor(a)
如果这是 PyTorch 方法),
然后
a.mystery_method((3,4))
会产生输出
array([[5, 6, 7, 8],
[1, 2, 3, 4],
[5, 6, 7, 8]])
不幸的是,我现在无法在 Numpy 或 Pytorch 文档中找到此方法。它是否真的存在,如果存在它是什么?
您可以使用 np.resize
-
M = 3 # number of rows for output
np.resize(a,(M,a.shape[1]))
使用 np.take
的另一种方式或简单地沿第一轴索引以提高性能 -
np.take(a,np.arange(M)%a.shape[0],axis=0) # with np.take
a[np.arange(M)%a.shape[0]] # with indexing
运行时测试 -
In [91]: a = np.random.randint(0,9,(2000,4000))
In [92]: M = 3000
In [93]: %timeit np.resize(a,(M,a.shape[1]))
10 loops, best of 3: 24.1 ms per loop
In [94]: %timeit np.take(a,np.arange(M)%a.shape[0],axis=0)
100 loops, best of 3: 16.2 ms per loop
In [95]: %timeit a[np.arange(M)%a.shape[0]]
100 loops, best of 3: 15.2 ms per loop