numpy高级操作,求高维矩阵的距离矩阵(方阵)以及 求某一个维度的累加和 , 矩阵切片操作

例:我们有维度为[Batch_size,T,V,C] 的数据,想得到维度为[Batch_size,T,V,V]的数据:

方法:

def calculate_dis(x): #N,T,V,C
    #x = np.array(x)
    sum_x = np.sum(np.square(x),3,keepdims = True)#先求对应元素的平方,然后按列相加,得到(N,T,V,1)的矩阵
    #print(a.shape)
    dist = np.add(np.add(-2*np.matmul(x,x.swapaxes(2,3)),sum_x),sum_x.swapaxes(2,3))
    #np.matmull()函数可以求矩阵指定维度内积,这里x = np.add()函数是将sum_x的转置行向量依次加到前面的(N,T,V,V)向量的每一行上。
    #这里x,x.swapaxes维度分别为[N,T,V,C] 和 [N,T,C,V]
    return dist

这里我们主要用到:np.square(x);

                                np.sum(x,dims,keepdims);

                                np.add(x,y) #将y转置加到x的每一行上,对y维度有要求

                                np.matmul(x,y) #求x,y内积

                                x.swapaxes(a,b) # 将x的a,b维度交换位置。

 

例:我们有维度为[Batch_size,T,V,C] 的数据,想沿T维度求相邻項的内积之和。

def attention_matrix(x,N,T,V,fps):
    dis_ = 0
    for k in range(T//fps + 1):
        #print(k)
        index_start = (k * fps if k is 0  else (k * fps - 1) ) 
        index_end = (k+1) * fps - 1
        if k == T//fps:
            dis_ += np.sum(np.square(x[:,index_start,:,:] - x[:,-1,:,:]),2) #[N,V]
        else:
            dis = np.sum(np.square(x[:,index_start,:,:] - x[:,index_end,:,:]),2)
            dis_ += dis
    attention_m = np.zeros([N,V,V])
    #将列向量扩展为对角线元素维向量元素的方阵
    for i in range (V):   
        attention_m[:,i,i] = dis[:,i]    
    
    return attention_m

这里我们主要搞清楚如何设置array的索引即可!!

注意:选取高维数据的某一维时应该用 ',  N  ,' 来操作:

例a 尺寸为 [100,25,7,7]

想依次获取第二维度所代表的所有数据[100,7,7]

就这样操作:

for i in range (25):

     b[i]  =  a[:,i,:,:]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值