numpy 元素外积

标签 numpy vectorization matrix-multiplication elementwise-operations

我想在 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 循环的矢量化实现。
有没有人有想法?
谢谢!

最佳答案

扩展 AB3D保持它们的第一个轴对齐并分别沿第三个和第二个轴引入新轴 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/

相关文章:

python - 生成转移矩阵

python - 如何向量化以下python代码?

c++ - 将 __m256 的奇数元素提取到 __m128 中的有效(在 Ryzen 上)方法?

compiler-construction - ARM NEON 矢量化失败

c++ - Armadillo 稀疏实矩阵与复 vector 的乘法

algorithm - 高阶矩阵乘法

python - 当两个值相同时,如何将 pandas 数据框列的值与变量进行比较以获得总和?

python - 使用 Open CV Python 将 alpha channel 添加到单色图像

python - 从系列中删除零的最快方法是什么

c - OpenMP 中的错误,试图为循环向量化矩阵乘法