python - 我如何在没有循环的情况下在 NumPy 中实现这个 "row in A * all rows in B by col in A"乘法?

标签 python numpy

假设我有两个矩阵 A 和 B:

A = np.array([[1, 3, 2],
              [2, 2, 3],
              [3, 1, 1]])

B = np.array([[0, 1, 0],
              [1, 1, 0],
              [1, 1, 1]])
我想取 A 中的一列并将其乘以 B 中的每一列元素,然后继续 A 中的下一列。因此,仅以一列为例,我将使用 A[:,0] (值 1,2,3),然后乘以 B 中的每一列得到:
array([[0, 1, 0],
       [2, 2, 0],
       [3, 3, 3]])
我已经使用 np.einsum 实现了这个像这样:
np.einsum('i,ij->ij',A[:,0],B)
然后我想生成一个 3D 矩阵,其深度维度对应于 A 中每一列的乘法,我使用 for 循环实现:
np.stack([np.einsum('i,ij->ij',A[:,i],B) for i in range(0,A.shape[1])])
这将返回我想要的数组:
array([[[0, 1, 0],
        [2, 2, 0],
        [3, 3, 3]],

       [[0, 3, 0],
        [2, 2, 0],
        [1, 1, 1]],

       [[0, 2, 0],
        [3, 3, 0],
        [1, 1, 1]]])
如果没有循环,我将如何进行此操作?这可以完全通过 np.einsum 完成吗? ? NumPy 中是否有另一个函数可以更简单地做到这一点?

最佳答案

这是一个简单的方法:

A.T[:,:,None]*B
添加最后一个 None在索引中创建一个新轴,然后用于广播元素乘法。

关于python - 我如何在没有循环的情况下在 NumPy 中实现这个 "row in A * all rows in B by col in A"乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66740244/

相关文章:

python - Boost Python - 用参数包装构造函数

python - numpy 数组 : error: 'total size of new array must be unchanged' 的简单 reshape

python - 如何从第二个索引开始for循环

python - 如何使用Python将RGB565字节数组转换为RGB888字节数组?

python - 如何使用 python ctypes 管理字符串内存

python - 在 python 中使用正则表达式将字符串中的第一个数字更改为 '#'

python - 将 Pandas Dataframe 转换为 sklearn 的 numpy

python - 如何减少此包含 2 个 for 循环的代码的运行时间?

python - 在 Python 中将数据导入 Namedtuple

python - 同时渲染模板和 send_from_directory