数组序列的numpy outerproduct
我有一个矩阵a(nXm)。我的最终目标是获得维度Z(nXmXm),目前我正在使用它,但是可以不使用for循环使用一些matrix.tensordot或matrix.multiply.outer吗数组序列的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
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