我尝试将2D数组中的每一项乘以1D数组中的相应项。如果我想将每一列乘以1D数组,这非常简单,如numpy.multiply函数所示。但我想做相反的事情,将行中的每一项相乘。换句话说,我想相乘:
[1,2,3] [0]
[4,5,6] * [1]
[7,8,9] [2]
并得到
[0,0,0]
[4,5,6]
[14,16,18]
但我却得到了
[0,2,6]
[0,5,12]
[0,8,18]
有谁知道有没有一种优雅的方法可以让 numpy 人这么做?非常感谢,亚历克斯
我尝试将2D数组中的每一项乘以1D数组中的相应项。如果我想将每一列乘以1D数组,这非常简单,如numpy.multiply函数所示。但我想做相反的事情,将行中的每一项相乘。换句话说,我想相乘:
[1,2,3] [0]
[4,5,6] * [1]
[7,8,9] [2]
并得到
[0,0,0]
[4,5,6]
[14,16,18]
但我却得到了
[0,2,6]
[0,5,12]
[0,8,18]
有谁知道有没有一种优雅的方法可以让 numpy 人这么做?非常感谢,亚历克斯
7条答案
按热度按时间hsgswve41#
如你所示的正规乘法:
如果添加一个轴,它将以您想要的方式倍增:
您也可以转置两次:
41zrol4v2#
我比较了不同选项的速度,发现所有选项(除了
diag
)的速度都一样快,这让我很惊讶。(or
(A.T * b).T
),因为它很短。用于重现绘图的代码:
1u4esq0p3#
您还可以使用矩阵乘法(又名点积):
哪个更优雅可能是品味的问题。
lkaoscv74#
还有一个技巧(从v1.6开始)
我对numpy broadcasting(
newaxis
)很精通,但是我仍然在摸索这个新的einsum
工具,所以我不得不尝试一下来找到这个解决方案。计时(使用Ipython timeit):
顺便说一句,把
i
改成j
,np.einsum('ij,j->ij',A,b)
,会产生亚历克斯不想要的矩阵,而np.einsum('ji,j->ji',A,b)
实际上是双重转置。2eafrhcq5#
对于那些在谷歌上迷失的灵魂,使用
numpy.expand_dims
然后numpy.repeat
将工作,也将工作在更高维度的情况下(即乘以形状(10,12,3)与(10,12))。trnvg8h36#
你需要将行数组转换成列数组,而transpose不能做到这一点。请改用reshape:
使用整形:
uajslkp67#
你为什么不
??