python - 将 numpy 数组设置为切片而无需任何就地操作

标签 python numpy pytorch sparse-matrix in-place

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

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 行应该放在行 n_id[0]z_sparse ,然后是 z 的第 2 行应该在行 n_id[1]z_sparse , 等等...

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

最佳答案

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是一个常量数组(张量),你的图应该可以正常工作。

关于python - 将 numpy 数组设置为切片而无需任何就地操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62076485/

相关文章:

python - 如何在pytorch中使用反向传播和自定义损失?

python - NumPy 转换中的 PyTorch 就地运算符问题

python - 按期限顺序对 pandas 数据框进行排序

python - 值错误 : cannot reshape array of size 230 into shape (3, 600,800)

python - 关于幅度的语法错误

python - 如何加速 Numpy 数组过滤/选择?

python - 如何将不同长度的时间窗应用于 Pandas 数据框

python - pytorch中的外和等

python - 如何连接两个单独的字符串

python - 从 pandas 数据框列值的两侧添加 n 个值