ValueError:无法从形状(51)到(51,1)

时间:2017-01-12 15:54:49

标签: python numpy

我收到以下代码的上述值错误:

np.random.seed(0);

num_samples=1000;   len_time=50;      dim_data=1;

#The times series X_{1:T} is uniform in the grid [0,1]^2;
#X_train is a collection of such time series
X_train=np.random.uniform(0,1,(num_samples,len_time+1,dim_data));


#Regression coeffecients
beta_1=np.array([-1]); beta_2= np.array([0.5]);

Y_train=np.zeros_like(X_train);


#Creating the model Y_t=X_t.dot(beta_1)+X_{t-1}.dot(beta_2);
for k in range(len(X_train)):
    x=X_train[k];
    Y_train[k]=x.dot(beta_1)+(np.roll(x,1,axis=0)).dot(beta_2)

它显示for循环最后一行的值错误。我不明白为什么这应该成为一个问题。我在for循环中单独验证了这行,没有任何问题。

2 个答案:

答案 0 :(得分:1)

要进行广播,尺寸需要兼容,并且您要将1D阵列分配给2D阵列。如果dim_data始终为1,则可以删除它,或者Y_train=squeeze(np.zeros_like(X_train));使Y_train为2D,因此Y_train[k]为1D。或者,您可以为等式的RHS添加维度,因此它也是2D,如下所示:

Y_train[k]=(x.dot(beta_1)+(np.roll(x,1,axis=0)).dot(beta_2))[:,None]

在这种情况下,如果Y_train[k]是>,则会将RHS添加到dim_data的每列中。这就是numpy中'广播'的含义。

答案 1 :(得分:0)

错误表示计算的RHS产生一个(51,)1d数组,但LHS槽是(51,1),是2d。广播可以将(51,)更改为(1,51),但不能更改为(51,1)。

  

目前尚不清楚,我建议对基本的numpy文档进行审核。了解尺寸,形状和广播是至关重要的。

下一步是了解尺寸的来源。

X_train创建为(num_samples,len_time+1,dim_data)Y_train份。因此Y_train[k]具有形状(len_time+1,dim_data) - 因此是2d(51,1)。 x

也是如此

RHS有两个广播兼容的术语,并且由于dot求和而产生(51,)。

x.dot(beta_1)+(np.roll(x,1,axis=0)).dot(beta_2)
(51,1) dot ((1,) => (51,)

要真正解决此问题,您需要使用大于1的dim_data。使用1可以挤出尺寸,但如果第3个尺寸更大,那将无济于事。

当RHS使用Y_train产品从x删除最后一个维度时,为什么dot会初始化为3d?