Используйте np.fromfunction
, чтобы определить матрицу, чьи записи - это нужные вам множители.Например, если
A = np.array([[1, 0, 0],
[3, 4, 0],
[6, 7, 8]])
, то
B = np.clip(np.fromfunction(lambda i, j: i-j+1, A.shape), 0, None)
даст вам
B = np.array([[1, 0, 0],
[2, 1, 0],
[3, 2, 1]])
, а затем требуемый результат будет просто поэлементным произведением A
и B
:
C = A * B
приводит к
C = np.array([[1, 0, 0],
[6, 4, 0],
[18, 14, 8]])
Фактически, поскольку ваш A
имеет нижнюю треугольную форму, вы можете отбросить вызов до np.clip
в определенииB
и получите тот же C
.
Редактировать: Я немного неверно истолковал вопрос.Если B
в OP (позвольте мне назвать это b
, поскольку я уже использовал B
) не является последовательностью натуральных чисел, вы можете сделать
B = np.tril(
np.fromfunction(
lambda i, j: b[np.clip((i-j).astype(int), 0, b.shape[0])],
A.shape))
Например,если
b = np.array([2, 3, 1, 4])
, то вы получите
B = np.array([[2, 0, 0],
[3, 2, 0],
[1, 3, 2]])