Numpy - создать почти нулевую матрицу со строкой из другой матрицы - PullRequest
0 голосов
/ 04 июля 2018

У меня квадратная матрица 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 ?

...