Установка массива numpy на срез без каких-либо операций на месте - PullRequest
4 голосов
/ 29 мая 2020

Как я могу эффективно выполнить эту операцию без каких-либо операций на месте?

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

По сути, я хочу, чтобы строки n_id z_sparse содержали строки z, но я не могу выполнять какие-либо операции на месте, потому что моя конечная цель состоит в том, чтобы использовать это в задаче pytorch.

Один из них - создать нулевые строки внутри z точно так, чтобы строки z попали в позиции n_id, но не уверен, как это будет работать эффективно.

По сути, строка 1 из z должна быть размещена в строке n_id[0] из z_sparse, затем строка 2 из z должна быть в строке n_id[1] из z_sparse, и так далее ...

Вот ошибка PyTorch ji c вам интересно: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

1 Ответ

2 голосов
/ 29 мая 2020

Если 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 - постоянный массив (тензор), ваш график должен работать просто хорошо.

...