我的问题是关于Python数组的形状。
数组大小(2, )
和(2, 1)
之间有什么区别?
我试图将这两个数组加在一起。但是,我收到如下错误:
形状为(2,)的不可播放的输出操作符与广播形状(2,2)不匹配
答案 0 :(得分:0)
(2,)是一维数组,(2,1)是只有一列的矩阵
您可以通过使用np.zero
传递所需形状来装满充满零的数组来轻松查看差异:
>>> np.zeros((2,))
array([0., 0.])
>>> np.zeros((2,1))
array([[0.],
[0.]])
答案 1 :(得分:0)
原始内存没有区别。但从逻辑上讲,一个是两个值的一维数组,另一个是二维数组(其中一个维度恰好是1号)。
逻辑上的区别对numpy
很重要;当你尝试添加它们时,它想要制作一个新的2x2数组,其中顶行是(2, 1)
数组顶部"行"的总和。与(2,)
数组中的每个值。如果您使用+=
来执行此操作,则表明您希望能够修改(2,)
数组,这在没有调整大小的情况下是不可能的(numpy
不会做的。)如果您更改了以下代码:
arr1 += arr2
为:
arr1 = arr1 + arr2
它会愉快地创建一个新的(2, 2)
数组。或者如果目标是2x1阵列应该像平坦的1D阵列那样,你可以flatten
:
alreadyflatarray += twodarray.flatten()
答案 2 :(得分:0)
创建一个具有形状(2,)的数组
In [164]: a = np.array([3,6])
In [165]: a
Out[165]: array([3, 6])
In [166]: a.shape
Out[166]: (2,)
In [167]: a.reshape(2,1)
Out[167]:
array([[3],
[6]])
In [168]: a.reshape(1,2)
Out[168]: array([[3, 6]])
第一个显示为简单列表[3,6]
。第二个作为具有2个嵌套列表的列表。第三个是列表,其中包含一个嵌套的2个项目列表。因此,形状和列表嵌套之间存在一致的关系。
In [169]: a + a
Out[169]: array([ 6, 12]) # shape (2,)
In [170]: a + a.reshape(1,2)
Out[170]: array([[ 6, 12]]) # shape (1,2)
In [171]: a + a.reshape(2,1)
Out[171]:
array([[ 6, 9], # shape (2,2)
[ 9, 12]])
尺寸表现为:
(2,)+(2,)=> (2) (2,)+(1,2)=> (1,2)+(1,2)=> (1,2) (2,)+(2,1)=> (1,2)+(2,1)=> (2,2)+(2,2)=> (2,2)
这是一个较低维度的数组,可以扩展到匹配的维数,并增加前导尺寸1维。
可以更改尺寸1尺寸以匹配相应的尺寸。
我怀疑你在做a += ...
时遇到了错误(如果是这样的话,你应该说得很清楚。)
In [172]: a += a
In [173]: a += a.reshape(1,2)
....
ValueError: non-broadcastable output operand with shape (2,)
doesn't match the broadcast shape (1,2)
In [175]: a += a.reshape(2,1)
...
ValueError: non-broadcastable output operand with shape (2,)
doesn't match the broadcast shape (2,2)
添加a+=...
后,结果形状固定为(2,),形状为a
。但如上所述,这两个加法产生(1,2)和(2,2)结果,这些结果与(2,)不相容。
同样的推理可以解释这些添加和错误:
In [176]: a1 = a.reshape(1,2)
In [177]: a1 += a
In [178]: a1
Out[178]: array([[12, 24]])
In [179]: a2 = a.reshape(2,1)
In [180]: a2 += a
...
ValueError: non-broadcastable output operand with shape (2,1)
doesn't match the broadcast shape (2,2)
In [182]: a1 += a2
...
ValueError: non-broadcastable output operand with shape (1,2)
doesn't match the broadcast shape (2,2)