Python 如何将标量矩阵与向量矩阵按元素相乘?

Python 如何将标量矩阵与向量矩阵按元素相乘?,python,numpy,Python,Numpy,如何转换以下形式的numpy数组 [[1,2] [3,4]] [[[1,1,1],[2,2,2]] [[3,3,3],[4,4,4]]] 进入表格的B部分 [[1,2] [3,4]] [[[1,1,1],[2,2,2]] [[3,3,3],[4,4,4]]] 这样我就可以用C进行元素相乘 [[[ 5, 6, 7],[ 8, 9,10]] [[11,12,13],[13,15,16]]] ? 最初的问题是将标量与向量相乘,例如4*[13,15,16]。但我没有标量,而是标量矩阵

如何转换以下形式的numpy数组

[[1,2]
 [3,4]]
[[[1,1,1],[2,2,2]]
 [[3,3,3],[4,4,4]]]
进入表格的B部分

[[1,2]
 [3,4]]
[[[1,1,1],[2,2,2]]
 [[3,3,3],[4,4,4]]]
这样我就可以用C进行元素相乘

[[[ 5, 6, 7],[ 8, 9,10]]
 [[11,12,13],[13,15,16]]]
?


最初的问题是将标量与向量相乘,例如
4*[13,15,16]
。但我没有标量,而是标量矩阵(a),也没有向量,而是向量矩阵(C)。如果有一种方法没有像B中那样实际复制值,我更愿意这样做(我想明显的for循环太慢了)。

您已经在评论中提到了答案:

A[:,:,None] * C
之所以这样做,是因为numpy将
None
切片解释为
newaxis
。发件人:

选择元组中的每个newaxis对象用于将结果选择的维度扩展一个单位长度维度。添加的维度是newaxis对象在选择元组中的位置

所以这个切片相当于这样做:

A.reshape(len(A), -1, 1)*C

既然我假设它们是numpy
array
s,那么乘法在默认情况下当然是元素性的。

Hmm,我想我刚刚得到了:
A[:,:,None]*C
,但我还不太明白这里发生了什么。你也可以做
A[…,None]*C
,这将适用于任意数量的维度,而不仅仅是两个维度。@neo,这里发生的事情是,您已经发现:)在
重塑
中的更多信息不会修改
A
,因此最后的示例仍然会给出广播错误。也许你的意思是:
A.重塑(len(A),-1,1)*C,这会给出相同的结果。啊,你说得对。当我这么做的时候,我甚至打开了一个REPL=X固定。仅用于文档:
A[:,:,None]
然后生成
[[1],[2],[[3],[4]]
,因此具有形状
(2,2,1)
,这反过来使它可以广播到
C
的形状
(2,2,3)
,从而启用乘法——因为广播隐式地将
(2,2,1)
扩展到
(2,2,3)
通过重复这些值(不是字面意思,而是作为for循环的一部分在内部重复)。还有一件事。我想我理解了为什么我的例子不能简单地工作,尽管更简单的例子(标量和向量)可以。这可能是因为标量在广播时是专门处理的,它相当于一个元素数组,其形状为
(1)
,从而导致有效的广播。因此,如果我在
A
中将我的标量表示为给定矩阵中的一个元素数组,那么它就可以工作了。这更像是一种理论观点,但仍然很有趣。