2017-06-17 47 views
0

有代码的一部分:如何应对“ValueError异常:操作数无法与形状(10000)(10000,10)一起播出”在numpy的

batch = getRandomBatch(batch_size) 
users_ind = batch[0, :, 0] 
items_ind = batch[0, :, 2] 
for i in range(25): 
    sum_loss, err = computeLossFunction(batch) 
    users_mat[users_ind, :] += err*items_mat[items_ind, :] 

它抛出一个ValueError异常, '操作数不能与形状(10000,)(10000,10)'在users_mat[users_ind, :] += err*items_mat[items_ind, :]'我不知道如何处理它。
为什么err的形状是(10000,)而不是(10000,1)?

============================================== ==========================

users_mat = np.random.rand(len_users, latent_space_dimension) 
items_mat = np.random.rand(len_items, latent_space_dimension) 
def getRandomBatch(batch_size): 
    batch = np.random.choice(len_data_mat-1, size=(1, batch_size)) 
    batch = data_mat[batch] 
    return batch 

def computeLossFunction(data_mat): 
    items_ind = data_mat[0, :, 2] 
    rates = data_mat[0, :, 1] 
    users_ind = data_mat[0, :, 0] 
    vector_items = items_mat[items_ind, :] 
    vector_users = users_mat[users_ind, :] 
    dot_list = np.sum(vector_items*vector_users, axis=1) 
    err = rates-dot_list 
    piece = np.power(err, 2)+lambda_val*(np.sum(np.power(vector_users, 2), axis=1) + np.sum(np.power(vector_items, 2), axis=1)) 
    sum_loss = np.mean(piece) 
    return sum_loss, err 

data_mat是10000行3列矩阵numpy的
尝试后,ERR = err.reshape(-1,1)可以解决这个问题,但我仍然不明白为什么err的形状是(10000,)而不是(10000,1),所以我必须明确重塑。

+0

请创建一个[mcve]。目前还不清楚'getRandomBatch'和'computeLossFunction'是什么。 – Praveen

+0

@Praveen现在更新问题,重新明确err显式工作,但我仍然不明白为什么err的形状是(10000,),而不是(10000,1) – FesianXu

+0

在'computeLossFunction''' data_mat'是3d,但与索引'率'是1d。类似地,'sum'减少了输入的尺寸,所以'dot_list'也是1d。记住这是'numpy',而不是'MATLAB'。 – hpaulj

回答

0

(10000,)的阵列上使用.reshape(-1, 1),反之亦然在另一个阵列上。

从您的代码中也可以看出data_mat是2D,而不是3D,这可能是您的困惑之源。 I.e .:

data_mat = np.empty((10000, 3)); data_mat.ndim 
Out[9]: 2 

data_mat[0, :, 2] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-10-4b9c676abc55> in <module>() 
----> 1 data_mat[0, :, 2] 

IndexError: too many indices for array 
+0

它的工作原理,但我仍然不明白为什么err的形状是(10000,)而不是(10000,1),函数'getRandomBatch'和'computeLossFunction'如上所示 – FesianXu

相关问题