np.add.at理解
原文链接:https://blog.csdn.net/qq_42698422/article/details/101062718
添加了一些容易理解的注释内容
先通俗说一下,就是 在指定的位置上 加上指定的值
import numpy as np
a=np.array([1,2,3,4])
np.add.at(a,[0,1,2,2],1)
print(a)
#输出,
#参数1:a 返回结果
#参数2:[0,1,2,2] 索引
#参数 3 :1 按索引要加的值
#所以这里表示的是,在0的位置+1;在1的位置+1;在2的位置+1;在2的位置+1
[2 3 5 4]
第二个例子
a=np.array([1,2,3,4])
b=np.array([1,2])
np.add.at(a,[0,1],b)
#从0和1的位置分别加1和2
print(a)
#输出[2 4 3 4]
第三个例子
x=([0,4,1],[3,2,4])
dW=np.zeros((5,6),int)
np.add.at(dW,x,1)
#分别在位置为第0行第3列;第4行第2列;第1行第4列的位置+1
dW
#输出
array([[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.]])
第四个例子
dW=np.zeros((5,6),int)
np.add.at(dW,[[[1],[2]],[2,4,4]],[1,2,3])
#在1,2位置+1 在1,4位置+2 在1,4位置+3 在2,1位置+1 在2,4位置+2 在2,4位置+3
dW
#输出
array([[0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 5, 0],
[0, 0, 1, 0, 5, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
dW=np.zeros((5,6),int)
np.add.at(dW,[[[1],[2]],[2,4,4]],[[1],[2]]) #1,2 +1; 1,4+1 1,4+1 2,2+2 2,4+2 2,4+2
dW
#输出
array([[0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 2, 0],
[0, 0, 2, 0, 4, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
dW=np.zeros((5,6),int)
np.add.at(dW,[[[1],[2]],[2,4,4]],np.ones((2,3)))
#索引矩阵的和参数三的矩阵维度是一样的
#通俗的讲[[1],[2]] 索引的是np.ones的第一维度(行) 2行
#[2,4,4]索引的是np.ones的第二维度,列 3
#两个索引相结合确定的就是np.ones中的要加的值
dW
#输出
array([[0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 2, 0],
[0, 0, 2, 0, 4, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
#x shape is(N,T)
#dW shape is(V,D)
#dout shape is(N,T,D)
np.add.at(dW,x,dout)
#类似如下过程
for row inr range(N):
for col in range(T):
dW[x[row,col],:] +=dout[row,col,:]