我想在 numpy 中对两个二维数组进行元素外积。
A.shape = (100, 3) # A numpy ndarray
B.shape = (100, 5) # A numpy ndarray
C = element_wise_outer_product(A, B) # A function that does the trick
C.shape = (100, 3, 5) # This should be the result
C[i] = np.outer(A[i], B[i]) # This should be the result
一个简单的实现可以如下。
tmp = []
for i in range(len(A):
outer_product = np.outer(A[i], B[i])
tmp.append(outer_product)
C = np.array(tmp)
受堆栈溢出启发的更好解决方案。
big_outer = np.multiply.outer(A, B)
tmp = np.swapaxes(tmp, 1, 2)
C_tmp = [tmp[i][i] for i in range(len(A)]
C = np.array(C_tmp)
我正在寻找一种摆脱 for 循环的矢量化实现。
有没有人有想法?
谢谢!
最佳答案
扩展 A
和 B
至 3D
保持它们的第一个轴对齐并分别沿第三个和第二个轴引入新轴 None/np.newaxis
然后彼此相乘。这将允许 broadcasting
为矢量化解决方案发挥作用。
因此,一个实现将是 -
A[:,:,None]*B[:,None,:]
我们可以使用
ellipsis
将其缩短一点对于 A : :,:
并跳过列出剩余的最后一个轴 B
,像这样——A[...,None]*B[:,None]
作为另一种矢量化方法,我们也可以使用
np.einsum
,一旦我们通过字符串表示法语法并考虑这些表示法代表涉及幼稚循环实现的迭代器,这可能会更直观,就像这样 -np.einsum('ij,ik->ijk',A,B)
关于numpy 元素外积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378936/