【问题标题】:Numpy/PyTorch method for partial tiling用于部分平铺的 Numpy/PyTorch 方法
【发布时间】:2017-12-31 02:58:24
【问题描述】:

我似乎记得遇到过类似于numpy.tile 的 Numpy 或 PyTorch 方法,除了它允许部分平铺达到指定尺寸。所以如果我有

a = np.array([[5, 6, 7, 8],
              [1, 2, 3, 4]])

(或者,如果这是 PyTorch 方法,则相应地,t = torch.Tensor(a)),

然后

a.mystery_method((3,4))

会产生输出

array([[5, 6, 7, 8],
       [1, 2, 3, 4],
       [5, 6, 7, 8]])

不幸的是,我现在在 Numpy 或 Pytorch 文档中找不到这种方法。它是否真的存在,如果存在,它是什么?

【问题讨论】:

  • @Divakar 就是这样,谢谢!正在尝试a.resize(),这是不同的...请作为答案发布,以便我接受。
  • 所以,第二个输入参数例如4 在发布的示例中,总是与列数相同,对吧?
  • 是的。感谢您的分析。

标签: python arrays numpy array-broadcasting pytorch


【解决方案1】:

你可以使用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

【讨论】:

  • 警告 - 在旧版本中,np.resize 在引用和切片创建或原始数组时存在问题,并会抛出难以追踪的 ValueErrors。根据文档,ndarray.resize 仍然存在此问题。
猜你喜欢
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多