Эффективно назначать ноль нескольким столбцам в каждой строке массива 2D numpy

Я хочу присвоить ноль матрице 2d numpy, где для каждой строки у нас есть столбец отсечки, после которого следует установить ноль.

Например, здесь у нас есть матрица A размером 4x5 с отсеченными столбцами [1,3,2,4]. Что я хочу сделать:

import numpy as np
np.random.seed(1)
A = np.random.rand(4, 5)
cutoff = np.array([1,3,2,4])
A[0, cutoff[0]:] = 0
A[1, cutoff[1]:] = 0
A[2, cutoff[2]:] = 0
A[3, cutoff[3]:] = 0

Я мог бы сделать это с индексами строк и столбцами np.repeat , но моя матрица настолько велика, что я не могу этого сделать. Есть ли эффективный способ сделать это?


person Ash    schedule 29.08.2018    source источник


Ответы (1)


Используйте broadcasting для создания полной маски и назначать -

A[cutoff[:,None] <= np.arange(A.shape[1])] = 0

В качестве альтернативы с внешним методом builtin -

A[np.less_equal.outer(cutoff, range(A.shape[1]))] = 0
person Divakar    schedule 29.08.2018