数组大小差异Python

时间:2018-05-24 00:46:38

标签: python arrays numpy

我的问题是关于Python数组的形状。

数组大小(2, )(2, 1)之间有什么区别?

我试图将这两个数组加在一起。但是,我收到如下错误:

  

形状为(2,)的不可播放的输出操作符与广播形状(2,2)不匹配

3 个答案:

答案 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)