Вы можете использовать транслируемое сравнение NumPy -
>>> A[np.arange(n)[:, None] < m] = 0
>>>
array([[0., 0., 0., 0., 0., 0., 0., 0.],
[1., 1., 1., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1., 0., 0.],
[1., 1., 1., 1., 1., 1., 1., 0.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.]])
Здесь вызов [:, None]
увеличивает форму np.arange(n)
, так что сравнение <
транслируется по каждому элементу m
для каждого элемента в диапазоне. При этом генерируется логическая маска той же формы, что и A
, которая затем используется для установки значений на 0.
Примечание. Если гарантировано, что A
будет массивом из них, я бы порекомендовал решение Дивакара , которое очень похоже на это.