2016-08-30 48 views
-2

我试图遵循documentationnp.linalg.svd中提供的一些示例代码,以比较TDM矩阵上的SVD之后的术语和文档相似性。下面是我得到了什么:无法将形状(1285)中的输入数组广播成形(1285,5344)

results_t = np.linalg.svd(tdm_t) 
results_t[1].shape 

产生

(1285,) 

而且

results_t[2].shape 
(5334, 5334) 

所以后来试图播放这些结果来创建每个经典的SVD投影方式真正S矩阵,我得到了:

S = np.zeros((results_t[0].shape[0], results_t[2].shape[0]), dtype = float) 
S[:results_t[2].shape[0], :results_t[2].shape[0]] = results_t[1] 

最后一行产生错误:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-329-16e79bc97c4b> in <module>() 
----> 1 S[:results_t[2].shape[0], :results_t[2].shape[0]] = results_t[1] 

ValueError: could not broadcast input array from shape (1285) into shape (1285,5334) 

我在做什么错在这里?

+1

尝试'results_t [1] [:,无]' – Joel

+0

如果下面的答案没有帮助,您能否明确说明错误行将被执行? – Joel

+0

你想分配一个块还是对角线? – hpaulj

回答

0

(注意,在看毕波多黎各的回答,看起来也许是正确的解释是,你实际上并没有试图与该命令播出?这个答案显示了如何真正做到广播)。

X = scipy.zeros((5,4)) 
X 
> array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 

Y = scipy.arange(5) 
Y 
> array([0, 1, 2, 3, 4]) 
X[:,:]=Y 
> could not broadcast input array from shape (5) into shape (5,4) 

因此,而不是试图

X[:,:]=Y[:,None] 
X 
> array([[ 0., 0., 0., 0.], 
    [ 1., 1., 1., 1.], 
    [ 2., 2., 2., 2.], 
    [ 3., 3., 3., 3.], 
    [ 4., 4., 4., 4.]]) 

您可以从以下

Z = scipy.arange(4) 
Z 
> array([0, 1, 2, 3]) 
X[:,:]=Z 
X 
>array([[ 0., 1., 2., 3.], 
     [ 0., 1., 2., 3.], 
     [ 0., 1., 2., 3.], 
     [ 0., 1., 2., 3.], 
     [ 0., 1., 2., 3.]]) 
得到问题多一点理解10

这里的问题是,它确信你正在将Y(或Z)当作数组的一行处理,而你试图将它放入列中。做Y[:,None]基本上迫使它将Y解释为一列。

0

您在使用索引时正在使用切片。举个例子:

A = np.zeros((4, 5)) 
end0, end1 = A.shape 

# These are both true 
A == A[:, :] 
A[:, :] == A[:end0, :end1] 

# To get the diagonal of an array you want to use range or np.arange 
A[range(end0), range(end0)] == A.diagonal() 

一些其他的东西,你可能会发现有用:

# If U.shape is (a, b) and S.shape is (b,) 
U.dot(np.diag(S)) == (U * S) 

# IF V.shape (b, a) and S.shape is (b,) 
np.diag(S).dot(V) == (S.reshape(b, 1) * V) 
1

所以根据错误信息,目标

S[:results_t[2].shape[0], :results_t[2].shape[0]] 

(1285,5334),而源

results_t[1] 

(1285,)

因此,它必须将源广播到与目标匹配的形状,然后才能进行分配。如果试图用这些形状或者乘以等来对两个数组进行求和,那么这也适用。

  • 第一个广播步骤使维数匹配。来源是1d,所以它需要2d。 numpy将尝试results_t[1][np.newaxis,:],产生(1, 1285)

  • 第二步是扩大所有尺寸1尺寸以匹配其他尺寸。但这不可能发生在这里 - 因此错误。 (1285,5334)+(1,1285)?

======

如果你想分配给块(或全部S),然后使用:

S[:results_t[2].shape[0], :results_t[2].shape[0]] = results_t[1][:,np.newaxis] 

要指定r1对角的S,使用列表索引(而不是切片):

S[range(results_t[1].shape[0]), range(results_t[1].shape[0])] = results_t[1] 

S[np.diag_indices(results_t[1].shape[0])] = results_t[1] 

在这种情况下,那些ranges的长度必须匹配results_t[1]

相关问题