python - 将一个数组的每一行与numpy中另一个数组的每个元素相乘

标签 python numpy multidimensional-array

我在 numpy 中有两个数组 A 和 B。 A 保存笛卡尔坐标,每一行是 3D 空间中的一个点,形状为 (r, 3)。 B 的形状为 (r, n) 并包含整数。

我想做的是将 B 的每个元素与 A 中的每一行相乘,以便生成的数组具有形状 (r, n, 3)。例如:

# r = 3
A = np.array([1,1,1, 2,2,2, 3,3,3]).reshape(3,3)
# n = 2
B = np.array([10, 20, 30, 40, 50, 60]).reshape(3,2)

# Result with shape (3, 2, 3):
# [[[10,10,10], [20,20,20]],
# [[60,60,60], [80,80,80]]
# [[150,150,150], [180,180,180]]]

我很确定这可以用 np.einsum 来完成,但我已经尝试了很长时间,但无法正常工作。

最佳答案

使用broadcasting -

A[:,None,:]*B[:,:,None]

np.einsum还支持广播,你也可以使用它(感谢@ajcr 推荐这个简洁的版本)-

np.einsum('ij,ik->ikj',A,B)

sample 运行-

In [22]: A
Out[22]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [23]: B
Out[23]: 
array([[10, 20],
       [30, 40],
       [50, 60]])

In [24]: A[:,None,:]*B[:,:,None]
Out[24]: 
array([[[ 10,  10,  10],
        [ 20,  20,  20]],

       [[ 60,  60,  60],
        [ 80,  80,  80]],

       [[150, 150, 150],
        [180, 180, 180]]])

In [25]: np.einsum('ijk,ij->ijk',A[:,None,:],B)
Out[25]: 
array([[[ 10,  10,  10],
        [ 20,  20,  20]],

       [[ 60,  60,  60],
        [ 80,  80,  80]],

       [[150, 150, 150],
        [180, 180, 180]]])

关于python - 将一个数组的每一行与numpy中另一个数组的每个元素相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32561332/

相关文章:

java - java中如何使用多维数组获取每一行的总和?

ios - 定义具有多维属性的对象

python - 使用索引替换二维 numpy 数组的一部分

python - self.__class__ 的错误类继承?

python - 数组中所有点之间的最小欧氏距离数组

c++ - 如何使用 STL 翻转/反转二维数组的行或列

python - 处理 WSGI 脚本时发生异常 - IOError : failed to write data

Python 2.6 不喜欢附加到 zip 文件中的现有文件

python - 高效计算 numpy/scipy 中的交换矩阵

python - 与卷积的中心差异