2015-04-15 43 views
0

我试着输入向量做成numpy的矩阵:如何获得这些形状排队的numpy的矩阵

eigvec[:,i] = null 

不过,我不断收到错误:

ValueError: could not broadcast input array from shape (20,1) into shape (20) 

我已经使用flattenreshape尝试,但似乎没有任何工作

+0

'eigvec.shape'给你什么? – lightalchemist

+0

eigvec是(20,20) – Chris

+3

另外,什么是'null'定义为?它不是一个Python关键字。 – lightalchemist

回答

1

我可以猜测,

eigvec[:,i] = null.flat 

会工作(但null.flatten()也应该工作)。事实上,它看起来像NumPy抱怨,因为你正在分配一个伪1D数组(形状(20,1))到被认为是不同方向的一维数组(形状(1,20),如果你愿意的话)。

另一个解决方案是:

eigvec[:,i] = null.T 

,你正确移调 “矢量” null

这里的基本点是NumPy具有“广播”规则,用于在具有不同维数的数组之间进行转换。在2D和1D之间转换的情况下,将大小为n的一维数组广播到形状(1,n)(而不是(n,1))的二维数组中。更一般地说,缺少的尺寸被添加到原始尺寸的左侧。 (20,)变成(1,20)(而不是(20,1)),因此观察到的错误消息基本上说形状(20,)和(20,1)是不兼容的。事实上,一个是列矩阵,而另一个是行矩阵。

+0

如错误消息所述,赋值目标的形状为(20),而不是(20,1)。其余的都是正确的。 –

+0

我不确定我是否关注你:我不是说目标*具有*形状(20,1):我说的是NumPy将“指定给一维数组”--so,而不是2D形状(20,1) )。我也暗示,虽然人们可以认为这个20个元素的1D数组可以被自动转换为形状(20,1),但实际上它被NumPy *视为形状(1,20),因此错误消息(和'null.T'解决方案)。 – EOL

+1

我只是认为你原来的措辞有点令人困惑,但你的编辑更清晰(无论如何,我高举你的原始答案) –

1

错误信息中的形状是一个很好的线索。

In [161]: x = np.zeros((10,10)) 

In [162]: x[:,1] = np.ones((1,10)) # or x[:,1] = np.ones(10) 

In [163]: x[:,1] = np.ones((10,1)) 
... 
ValueError: could not broadcast input array from shape (10,1) into shape (10) 
In [166]: x[:,1].shape 
Out[166]: (10,) 
In [167]: x[:,[1]].shape 
Out[167]: (10, 1) 

In [168]: x[:,[1]] = np.ones((10,1)) 

当目标的形状与新值的形状匹配时,复制起作用。它也适用于可以“广播”以适应新价值的一些情况。但它并没有尝试更普遍的重塑。另请注意,使用标量索引可降低维度。