值错误:无法将输入数组从形状(51)广播到(51,1)

2024-03-29 11:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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循环中的那一行,没有任何问题。在


Tags: fordatalentimeis错误nptrain
2条回答

要进行广播,维度必须是兼容的,并且要将1D数组分配给2D数组。如果dim_data总是1,你可以去掉它,或者做Y_train=squeeze(np.zeros_like(X_train));使Y_train2D,那么{}是1D。或者,你可以在方程的RHS上加一个维数,这样它也是2D的:

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

在这种情况下,如果dim_data为1,则RHS将被添加到Y_train[k]的每一列。这就是纽比语中“广播”的意思。在

错误是说,你计算的RHS生成了一个(51,)1d数组,但LHS插槽是(51,1),一个2d。广播可以将(51,)改为(1,51),但不能改为(51,1)。在

It that's not clear, I'd suggest a review of basic numpy documentation. Understanding dimensions, shapes and broadcasting are fundamental.

下一步是了解维度的来源。在

X_train创建为(num_samples,len_time+1,dim_data),和Y_train个副本。因此Y_train[k]具有(len_time+1,dim_data)的形状,因此是2d(51,1)。对x相同

RHS有2个与广播兼容的项,并且由于dot和而产生(51,)。在

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

要真正修复此问题,您需要使用大于1的dim_data。如果是1,你可以只挤出维度,但如果第三维度更大,那就没用了。在

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

相关问题 更多 >