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