我收到以下代码的上述值错误:
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循环中单独验证了这行,没有任何问题。
答案 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?