У меня квадратная матрица A , и я хочу создать матрицу Z , элементы которой равны нулю везде, кроме i-й строки, а i-я строка - j'th ряд матрицы A .
Я знаю два способа сделать это. Первый довольно прост и, кажется, наиболее эффективен с точки зрения производительности:
def do_this(mx: np.array, i: int, j: int):
Z = np.zeros_like(mx)
Z[i, :] = mx[j, :]
return Z
Другой, менее простой и, казалось бы, гораздо менее эффективный способ заключается в том, чтобы заранее подготовить матрицу mx , которая имеет нулевую матрицу той же формы, что и A , но имеет 1 в это (i, j) положение, а затем вычислить Z как мх @ A .
def do_this_other_way(mx: np.array, ref_mx: np.array):
return ref_mx @ mx
Я решил сравнить оба подхода:
from time import time
import numpy as np
n = 20
num_iters = 5000
A = np.random.rand(n, n)
i, j = 5, 10
t = time()
for _ in range(num_iters):
Z = do_this(A, i, j)
print((time() - t) / num_iters)
ref_mx = np.zeros_like(A)
ref_mx[i, j] = 1
t = time()
for _ in range(num_iters):
Z = do_this_other_way(A, ref_mx)
print((time() - t) / num_iters)
Однако, когда A относительно небольшой (на моем ноутбуке это означает, что размер A меньше 40), do_this_other_way выигрывает, и когда A имеет размер, равный 20, он выигрывает на порядок.
Вот и все: я сомневаюсь, что я делаю это наиболее эффективным способом, каким только можно. Можно ли сделать это лучше, не прибегая к написанию собственной низкоуровневой реализации do_this ?