numpy-用其他矩阵的行创建一个几乎为零的矩阵

时间:2018-07-04 18:29:09

标签: python performance numpy sparse-matrix matrix-multiplication

我有一个方阵 A ,我想创建一个矩阵 Z ,除第i行外,其他所有元素都为零,第i行为j矩阵 A 的第'行。

我知道实现此目的的两种方法。拳头相当简单,似乎是最有效的表现方式:

def do_this(mx: np.array, i: int, j: int):
    Z = np.zeros_like(mx)
    Z[i, :] = mx[j, :]
    return Z

另一种不太直接,效率似乎低得多的方法是事先准备一个 mx 矩阵,该矩阵的形状与 A 相同,但具有零形状(i,j)位置为1,然后将 Z 计算为 mx @ 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时,则获胜一个数量级。 就是这样:我怀疑自己在numpy中是否正在以最有效的方式进行此操作。是否可以在不依靠编写自己的 do_this 底层实现的情况下做得更好?

0 个答案:

没有答案