如何在 python 中矢量化这个(numpy)操作?

我有两个 shape 向量,(batch, dim)我试图将它们相减。目前,我正在使用一个简单的循环从 1 中减去error基于第二个向量(即label)的向量(即)中的特定条目:


per_ts_loss=0

for i, idx in enumerate(np.argmax(label, axis=1)):

    error[i, idx] -=1

    per_ts_loss += error[i, idx]

我怎样才能矢量化这个?


例如,错误和标签可能如下所示:


error :

array([[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548 ]

       [ 0.64589411  0.43758721  0.891773    0.96366276  0.38344152]])

label:

    array([[0, 0, 0, 1, 0 ],

           [0, 1, 0, 0, 0]])

对于此示例,运行以下代码会产生以下结果:


for i, idx in enumerate(np.argmax(label,axis=1)):

    error[i,idx] -=1

    ls_loss += error[i,idx]

结果 :


error: 

 [[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548 ]

 [ 0.64589411  0.43758721  0.891773    0.96366276  0.38344152]]

label: 

 [[ 0.  0.  0.  1.  0.]

 [ 0.  1.  0.  0.  0.]]


error(indexes 3 and 1 are changed): 

[[ 0.5488135   0.71518937  0.60276338 -0.45511682  0.4236548 ]

 [ 0.64589411 -0.56241279  0.891773    0.96366276  0.38344152]]

per_ts_loss: 

 -1.01752960574

这是代码本身:https : //ideone.com/e1k8ra


我被困在如何使用 的结果上np.argmax,因为结果是一个新的索引向量,它不能简单地像这样使用:


 error[:, np.argmax(label, axis=1)] -=1

所以我被困在这里了!


尚方宝剑之说
浏览 203回答 2
2回答

慕婉清6462132

代替:error[:, np.argmax(label, axis=1)] -=1和:error[np.arange(error.shape[0]), np.argmax(label, axis=1)] -=1而且当然loss = error[np.arange(error.shape[0]), np.argmax(label, axis=1)].sum()在您的示例中,您正在更改、求和、error[0,3]和error[1,1],或简而言之error[[0,1],[3,1]]。

慕雪6442864

也许这个:import numpy as nperror = np.array([[0.32783139, 0.29204386, 0.0572163 , 0.96162543, 0.8343454 ],       [0.67308787, 0.27715222, 0.11738748, 0.091061  , 0.51806117]])label= np.array([[0, 0, 0, 1, 0 ],           [0, 1, 0, 0, 0]])def f(error, label):    per_ts_loss=0    t=np.zeros(error.shape)    argma=np.argmax(label, axis=1)    t[[i for i in range(error.shape[0])],argma]=-1    print(t)    error+=t    per_ts_loss += error[[i for i in range(error.shape[0])],argma]f(error, label)输出:[[ 0.  0.  0. -1.  0.] [ 0. -1.  0.  0.  0.]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python