数组序列的numpy outerproduct

数组序列的numpy outerproduct,numpy,matrix-multiplication,Numpy,Matrix Multiplication,我有一个矩阵a(nXm)。我的最终目标是获得维度Z(nXmXm),目前我正在使用它,但是可以不使用for循环使用一些matrix.tensordot或matrix.multiply.outer吗 for i in range(0,A.shape[0]): Z[i,:,:] = np.outer(A[i,:],A[i,:]) 你可以这样使用: np.einsum('ij,ik->ijk',a,a) 为了完整起见,与unutbu的优秀答案(+1)进行时间比较: [39]中的A=n

我有一个矩阵a(nXm)。我的最终目标是获得维度Z(nXmXm),目前我正在使用它,但是可以不使用for循环使用一些matrix.tensordot或matrix.multiply.outer吗

 for i in range(0,A.shape[0]):
       Z[i,:,:] = np.outer(A[i,:],A[i,:])
你可以这样使用:

np.einsum('ij,ik->ijk',a,a)
为了完整起见,与unutbu的优秀答案(+1)进行时间比较:

[39]中的
A=np.random.random((1000,50))
在[40]:%timeit使用_einsum(A)
100个回路,最好为3:11.6 ms/回路
在[41]:%timeit使用_广播(A)
100个回路,最好为3:10.2 ms/回路
在[42]:%timeit orig(A)
10个回路,最佳3个:每个回路27.8毫秒
这告诉我

  • 联合国大学的机器比我的快
  • 广播速度将略快于
    np.einsum
  • 意味着

    可使用以下公式计算:

    A[:,:,np.newaxis]
    A[:,np.newaxis,:]
    具有形状
    (n,1,m)
    。将这两个数组相乘将使两个数组的广播次数达到 形状
    (n,m,m)

    NumPy乘法总是按元素执行。沿线的值 广播轴在任何地方都是相同的,所以元素相乘的结果是相同的 在
    Z_ijk=A_ij*A_ik


    下面是一个健全性检查,显示这会产生正确的结果:

    A = np.random.random((1000,50))
    assert np.allclose(using_broadcasting(A), orig(A))
    
    通过将A.shape[0]选择为大,我们得到了一个示例,展示了 Python中广播优于循环的优势:

    In [107]: %timeit using_broadcasting(A)
    10 loops, best of 3: 6.12 ms per loop
    
    In [108]: %timeit orig(A)
    100 loops, best of 3: 16.9 ms per loop
    

    非常感谢你。事实上,我的A.shape[0]在我的例子中很大。
    Z = A[:, :, np.newaxis] * A[:, np.newaxis, :]
    
    import numpy as np
    
    def orig(A):
        Z = np.empty(A.shape+(A.shape[-1],), dtype=A.dtype)
        for i in range(0,A.shape[0]):
            Z[i,:,:] = np.outer(A[i,:],A[i,:])
        return Z
    
    def using_broadcasting(A):
        return A[:, :, np.newaxis] * A[:, np.newaxis, :]
    
    A = np.random.random((1000,50))
    assert np.allclose(using_broadcasting(A), orig(A))
    
    In [107]: %timeit using_broadcasting(A)
    10 loops, best of 3: 6.12 ms per loop
    
    In [108]: %timeit orig(A)
    100 loops, best of 3: 16.9 ms per loop