Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)如何获得对角线(A*B),而不必执行A*B?_Python_Numpy_Matrix - Fatal编程技术网

(Python)如何获得对角线(A*B),而不必执行A*B?

(Python)如何获得对角线(A*B),而不必执行A*B?,python,numpy,matrix,Python,Numpy,Matrix,假设我们有两个矩阵A和B,让矩阵C成为A*B(矩阵乘法不是元素)。我们只希望获得C的对角线条目,这可以通过np.diagonal(C)完成。但是,这会导致不必要的时间开销,因为我们将A与B相乘,即使我们只需要将A中的每一行与B中具有相同“id”的列相乘,即A的第1行与B的第1列相乘,A的第2行和B的第2列依此类推:构成C对角线的乘法。有没有一种方法可以使用Numpy有效地实现这一点?我希望避免使用循环来控制哪一行与哪一列相乘,相反,我希望使用一个内置的numpy方法来执行此类操作以优化性能 提前

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

提前谢谢

def diag(A,B):
    diags = []
    for x in range(len(A)):
        diags.append(A[x][x] * B[x][x])
    return diags

我相信上面的代码就是您正在寻找的。

我可能会在这里使用
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
技巧也能奏效。]

请大家注意:
a*B
在NumPy中是元素式乘法,而不是矩阵乘法(即
a.dot(B)
).是
ndarray
matrix
类型的
A
B
吗?@Blair,如果
A
B
numpy.array
,情况就是这样。如果它们是
numpy.matrix
,则可以使用
A*B
@gnibbler D'oh。我习惯于忘记numpy。矩阵的存在是因为我习惯于处理三维数据。谢谢你指出这一点。@Bitwise、
A
B
都是矩阵,很抱歉没有澄清这不是如何工作的。对不起。我不知道你指的是标量积还是矩阵积。