在我的代码中,我乘以两个矩阵:
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)
它在这里工作的事实让我感到困惑......
答案 0 :(得分:4)
你的第一个数组只有1维,3"对象"元素,而你的第二个数组有1维和4个浮点元素。 numpy使用逐元素算术运算,并且它无法通过一个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_new
或aa
)是因为numpy广播数组。这里每一行都会乘以第二个数组中的一个项目。
答案 1 :(得分:2)
您的原始a
和副本aa
具有不同的形状。做a.shape
和aa.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]