gpt4 book ai didi

python - (Python) 如何在不执行 A*B 的情况下获得对角线 (A*B)?

转载 作者:太空狗 更新时间:2023-10-29 21:24:34 24 4
gpt4 key购买 nike

假设我们有两个矩阵 AB 并且让矩阵 CA*B(矩阵乘法不是按元素计算的)。我们希望只获取 C 的对角线条目,这可以通过 np.diagonal(C) 来完成。但是,这会导致不必要的时间开销,因为我们将 A 与 B 相乘,即使我们只需要将 A 中的每一行与 B 中具有相同的 'id',即 A 的第 1 行和 B 的第 1 列,A 的第 2 行和 B 的第 2 列 等等:形成 C 的对角线的乘法。有没有一种方法可以使用 Numpy 有效地实现这一目标?我想避免使用循环来控制哪一行与哪一列相乘,相反,我希望有一个内置的 numpy 方法来执行这种操作以优化性能。

提前致谢..

最佳答案

我可能会在这里使用 einsum:

>>> a = np.random.randint(0, 10, (3,3))
>>> b = np.random.randint(0, 10, (3,3))
>>> a
array([[9, 2, 8],
[5, 4, 0],
[8, 0, 6]])
>>> b
array([[5, 5, 0],
[3, 5, 5],
[9, 4, 3]])
>>> a.dot(b)
array([[123, 87, 34],
[ 37, 45, 20],
[ 94, 64, 18]])
>>> np.diagonal(a.dot(b))
array([123, 45, 18])
>>> np.einsum('ij,ji->i', a,b)
array([123, 45, 18])

对于较大的数组,它会比直接进行乘法运算快得多:

>>> a = np.random.randint(0, 10, (1000,1000))
>>> b = np.random.randint(0, 10, (1000,1000))
>>> %timeit np.diagonal(a.dot(b))
1 loops, best of 3: 7.04 s per loop
>>> %timeit np.einsum('ij,ji->i', a, b)
100 loops, best of 3: 7.49 ms per loop

[注意:最初我完成了元素版本,ii,ii->i,而不是矩阵乘法。相同的 einsum 技巧起作用。]

关于python - (Python) 如何在不执行 A*B 的情况下获得对角线 (A*B)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com