基本numpy乘法的麻烦

时间:2016-12-12 17:39:57

标签: python arrays numpy matrix

在我的代码中,我乘以两个矩阵:

c = b*a

a输出为

array([array([-0.08358731,  0.07145386,  0.1052811 , -0.05362566]),
       array([-0.05335939, -0.03136824, -0.01260714,  0.11532605]),
       array([-0.09164538,  0.02280118, -0.00290509,  0.09415849])], dtype=object)

b输出为

array([ 0.60660017,  0.54703557,  0.69928535,  0.70157223])

......这应该正常工作(其中b的值乘以a中每行的每个值)?

相反,我得到了

  

ValueError:操作数无法与形状(3)(4)

一起广播

但是当我在一个单独的python控制台中尝试它时,效果很好。 (记得我已设置array = np.array

>>>  aa = array([array([-0.12799382,  0.07758469, -0.02968546, -0.01811048]),
               array([-0.00465869, -0.00483031, -0.00591955, -0.00386022]),
               array([-0.02036786,  0.0078658 ,  0.09493727, -0.01790333])], dtype=object)

>>> bb = array([ 0.16650179,  0.74140229,  0.60859776,  0.37505098])

>>> aa * bb
array([[-0.021311200138937801, 0.057521466834940096, -0.0180665044605696,
        -0.0067923532722703999],
       [-0.00077568022405510005, -0.0035812028954099002,
        -0.0036026248702079999, -0.0014477792940156],
       [-0.0033912851484694004, 0.0058317221326819992, 0.0577786098625152,
        -0.0067146614617633995]], dtype=object)

它在这里工作的事实让我感到困惑......

2 个答案:

答案 0 :(得分:4)

你的第一个数组只有1维,3"对象"元素,而你的第二个数组有1维和4个浮点元素。 使用逐元素算术运算,并且它无法通过一个3项数组和一个4项数组来实现,因此异常。

>>> x = np.empty(3, dtype=object)
>>> x[0] = np.array([-0.08358731,  0.07145386,  0.1052811 , -0.05362566])
>>> x[1] = np.array([-0.05335939, -0.03136824, -0.01260714,  0.11532605])
>>> x[2] = np.array([-0.09164538,  0.02280118, -0.00290509,  0.09415849])
>>> x.shape
(3, )

以上示例是创建numpy.array的一种糟糕方式,应该避免!

第二个例子的不同之处在于它在数组中没有numpy-arrays,它创建了一个多维(3x4)数组:

>>> x_new = np.array(list(x))
>>> x_new  # no nested arrays!
array([[-0.12799382, 0.07758469, -0.02968546, -0.01811048],
       [-0.00465869, -0.00483031, -0.00591955, -0.00386022],
       [-0.02036786, 0.0078658, 0.09493727, -0.01790333]], dtype=object)
>>> x_new.shape
(3, 4)

乘法运算适用于新数组(x_newaa)是因为numpy广播数组。这里每一行都会乘以第二个数组中的一个项目。

答案 1 :(得分:2)

您的原始a和副本aa具有不同的形状。做a.shapeaa.shape。问题在于如何创建对象数组。 np.array尝试尽可能高地创建一个维度对象。

a是(3,)数组,包含3个数组的1d数组。

aa是(3,4)数组,2d数组包含数字作为对象(不是浮点数)。

构建a我必须走一条错综复杂的路线:

In [659]: a=np.empty((3,), object)
In [660]: a[0]=np.array([-0.08358731,  0.07145386,  0.1052811 , -0.05362566])
     ...: a[1]=np.array([-0.05335939, -0.03136824, -0.01260714,  0.11532605])
     ...: a[2]=np.array([-0.09164538,  0.02280118, -0.00290509,  0.09415849])
     ...: 
In [661]: a
Out[661]: 
array([array([-0.08358731,  0.07145386,  0.1052811 , -0.05362566]),
       array([-0.05335939, -0.03136824, -0.01260714,  0.11532605]),
       array([-0.09164538,  0.02280118, -0.00290509,  0.09415849])], dtype=object)
In [662]: a.shape
Out[662]: (3,)

我可以将这3个元素与另外3个元素数组相乘(这并不总是与object数组一起使用,但这里的元素实现*。)

In [663]: a*np.array([0,1,2])
Out[663]: 
array([array([-0.,  0.,  0., -0.]),
       array([-0.05335939, -0.03136824, -0.01260714,  0.11532605]),
       array([-0.18329076,  0.04560236, -0.00581018,  0.18831698])], dtype=object)

但如果我像你那样复制粘贴

In [665]: aa = array([array([-0.12799382,  0.07758469, -0.02968546, -0.01811048]
     ...: ),
     ...:            array([-0.00465869, -0.00483031, -0.00591955, -0.00386022])
     ...: ,
     ...:            array([-0.02036786,  0.0078658 ,  0.09493727, -0.01790333])
     ...: ], dtype=object)
In [666]: aa.shape
Out[666]: (3, 4)

现在(3,4)可以乘以(4,)数组。

vstack可以将(3,)对象数组转换为(3,4)浮点数组:

In [667]: a3=np.vstack(a)
In [668]: a3.shape
Out[668]: (3, 4)
In [669]: a3.dtype
Out[669]: dtype('float64')
In [670]: a3
Out[670]: 
array([[-0.08358731,  0.07145386,  0.1052811 , -0.05362566],
       [-0.05335939, -0.03136824, -0.01260714,  0.11532605],
       [-0.09164538,  0.02280118, -0.00290509,  0.09415849]])

==============

您可以将a乘以与形状和类型匹配的b

In [681]: b=np.empty((3,),object)
In [682]: for i in range(3):
     ...:     b[i]=np.arange(i,i+4)
     ...:     
In [683]: b    # 3 arrays of length 4 each
Out[683]: array([array([0, 1, 2, 3]), array([1, 2, 3, 4]), array([2, 3, 4, 5])], dtype=object)
In [684]: a*b
Out[684]: 
array([array([-0.        ,  0.07145386,  0.2105622 , -0.16087698]),
       array([-0.05335939, -0.06273648, -0.03782142,  0.4613042 ]),
       array([-0.18329076,  0.06840354, -0.01162036,  0.47079245])], dtype=object)

基本上它正在做:for i in range(3): res[i]=a[i]*b[i]