在没有任何就地操作的情况下将 numpy 数组设置为切片
Setting numpy array to slice without any in-place operations
如何在没有任何就地操作的情况下高效地执行此操作?
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_sparse
的第n_id[0]
行,然后z
的第2行应该放在n_id[1]
的第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
是一个常量数组(张量),您的图表应该可以正常工作。
如何在没有任何就地操作的情况下高效地执行此操作?
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_sparse
的第n_id[0]
行,然后z
的第2行应该放在n_id[1]
的第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
是一个常量数组(张量),您的图表应该可以正常工作。