Python 用一维数组乘以numpy-ndarray

Python 用一维数组乘以numpy-ndarray,python,numpy,array-broadcasting,Python,Numpy,Array Broadcasting,所以我可以在这个论坛上看到很多问题,问如何在给定的轴上用1d N乘以numpy N。大多数答案建议使用np.newaxis来满足广播要求。这里我有一个更具体的问题,我想在轴2上乘法,例如: >>> import numpy as np >>> x = np.arange(27).reshape((3,3,3)) >>> y = np.arange(3) >>> z = x*y[:,np.newaxis,np.newaxis]

所以我可以在这个论坛上看到很多问题,问如何在给定的轴上用1d N乘以numpy N。大多数答案建议使用np.newaxis来满足广播要求。这里我有一个更具体的问题,我想在轴2上乘法,例如:

>>> import numpy as np
>>> x = np.arange(27).reshape((3,3,3))
>>> y = np.arange(3)
>>> z = x*y[:,np.newaxis,np.newaxis]
>>> x
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
>>> y
array([0, 1, 2])
>>> z
array([[[ 0,  0,  0],
        [ 0,  0,  0],
        [ 0,  0,  0]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[36, 38, 40],
        [42, 44, 46],
        [48, 50, 52]]])

这就是我想要的乘法。 然而,在我的例子中,我得到的沿轴0和1的尺寸与沿轴2的尺寸不匹配,例如,当我尝试为我的阵列实现上述操作时,我得到以下结果:

>>> x = np.arange(144).reshape(8,6,3)
>>> z = x*y[:,np.newaxis,np.newaxis]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (8,6,3) (3,1,1) 
我现在没有在正确的轴上进行乘法


有什么办法解决这个问题吗?

您好,我已经设法把它做成一个长的格式,轴与您在第一个示例中所做的类似,但不确定这是否正确

将numpy导入为np
测试=np.arange(144)。重塑(8,6,3)
test2=np.arange(3)
数组([test[i]*test2[i]表示范围内的i(len(test.shape)))
>>>数组([[0,0,0],
[  0,   0,   0],
[  0,   0,   0],
[  0,   0,   0],
[  0,   0,   0],
[  0,   0,   0]],
[[ 18,  19,  20],
[ 21,  22,  23],
[ 24,  25,  26],
[ 27,  28,  29],
[ 30,  31,  32],
[ 33,  34,  35]],
[[ 72,  74,  76],
[ 78,  80,  82],
[ 84,  86,  88],
[ 90,  92,  94],
[ 96,  98, 100],
[102, 104, 106]]])

您希望它如何将3个
y
值与大小为8的维度相乘?如果查看数组x,其沿轴2的大小为3,与y的大小匹配。应该可以将数组相乘…您的最后一个表达式(与
x*y
相同)使用匹配的最后一个轴。但显然那不是你想要的。您只想将
x
的一部分乘以
y
x[:3]
。这样就得到了一个(3,6,3)数组,它在第一维度上匹配。这个选择在你的问题中并不明显。这是正确的,谢谢!良好的一线解决方案这有效地将
test
减少为(3,6,3)数组,
test[:3]
>>> z = x*y[np.newaxis,np.newaxis,:]