将numpy数组设置为切片而不进行任何就地操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将numpy数组设置为切片而不进行任何就地操作相关的知识,希望对你有一定的参考价值。

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

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

以上是关于将numpy数组设置为切片而不进行任何就地操作的主要内容,如果未能解决你的问题,请参考以下文章

如何就地反转 NumPy 数组?

再次对 Numpy 数组进行就地类型转换?

将多维元素附加到 numpy 数组中而不进行整形

numpy 切片和索引

Python中numpy 数组的切片操作

将 numpy 切片转换为 Opencv c++ Mat