【问题标题】:Setting numpy array to slice without any in-place operations将 numpy 数组设置为切片,无需任何就地操作
【发布时间】:2020-09-16 11:08:01
【问题描述】:

如何在没有任何就地操作的情况下有效地执行此操作?

n_id = np.random.choice(np.arange(2708), size=100)
z = np.random.rand(100, 64)
z_sparse = np.zeros((2708,64))
z_sparse[n_id[:100]] = z

基本上我希望 z_sparse 的 n_id 行包含 z 的行,但我不能执行任何就地操作,因为我的最终目标是在 pytorch 问题中使用它。

其中一种方法是在 z 中精确地创建零行,以便 z 的行最终位于位置 n_id,但不确定这将如何有效地工作。

基本上z的第1行应该放在z_sparsen_id[0]行,然后z的第2行应该放在z_sparsen_id[1]行,依此类推......

这是您好奇的 PyTorch 错误 jic: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

【问题讨论】:

  • 我很确定 pytorch 支持就地操作。
  • @user2357112supportsMonica 不在你的计算图中 - 它破坏了图
  • n_id 是固定张量吗?
  • @QuangHoang 是的。
  • 只是好奇,你需要在你的图表中,或者你能把所有这些都放在with torch.no_grad():

标签: python numpy pytorch sparse-matrix in-place


【解决方案1】:

如果n_id是固定索引数组,则可以得到z_sparse作为矩阵乘法:

# N, n, m = 2078,100, 64
row_mat = (n_id[:n] == np.arange(N)[:,None])

# for pytorch tensor
# row_mat = Tensor(n_id[:n] == np.arange(N)[:,None])

z_sparse =  row_mat @ z

由于row_mat 是一个常量数组(张量),您的图表应该可以正常工作。

【讨论】:

  • 非常有创意的答案
  • 您介意解释一下[:, None] 切片的作用吗?
  • @Guimute 那叫broadcasting。和.reshape(-1,1)有点等价。
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2021-12-28
  • 1970-01-01
  • 2015-07-05
相关资源
最近更新 更多