您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 可变交互的计算(矩阵中向量的点积)

5b51 2022/1/14 8:21:32 python 字数 2688 阅读 505 来源 www.jb51.cc/python

如果我将矢量x(1,n)与其自身相乘,即np.dot(x.T,x),我将得到二次形式的矩阵.如果我有一个矩阵Xmat(k,n),我怎样才能有效地计算行方点积并只选择上三角形元素?所以,atm.我有以下解决方案:def compute_interaction(x): xx = np.reshape(x, (1, x.size)) return

概述

如果我将矢量x(1,n)与其自身相乘,即np.dot(x.T,x),我将得到二次形式的矩阵.

如果我有一个矩阵Xmat(k,n),我怎样才能有效地计算行方点积并只选择上三角形元素?

所以,atm.我有以下解决方案:

def compute_interaction(x):
    xx = np.reshape(x,(1,x.size))
    return np.concatenate((x,np.dot(xx.T,xx)[np.triu_indices(xx.size)]))

然后compute_interaction(np.asarray([2,5]))yield数组([2,5,4,10,25]).

我有一个矩阵我用

np.apply_along_axis(compute_interaction,axis=1,arr = np.asarray([[2,5],[3,4],[8,9]]))

产生我想要的东西:

array([[ 2,25],[ 3,9,12,16],[ 8,64,72,81]])

除了使用apply_along_axis计算它之外,还有其他方法吗?也许使用np.einsum?

使用np.triu_indices的一个解决方案是 –

r,c = np.triu_indices(arr.shape[1])
out = np.concatenate((arr,arr[:,r]*arr[:,c]),axis=1)

方法#2

更快切割 –

def pairwise_col_mult(a):
    n = a.shape[1]
    N = n*(n+1)//2
    idx = n + np.concatenate(( [0],np.arange(n,-1).cumsum() ))
    start,stop = idx[:-1],idx[1:]
    out = np.empty((a.shape[0],n+N),dtype=a.dtype)
    out[:,:n] = a
    for j,i in enumerate(range(n)):
        out[:,start[j]:stop[j]] = a[:,[i]] * a[:,i:]
    return out

计时 –

In [254]: arr = np.random.randint(0,(10000,100))

In [255]: %%timeit
     ...: r,c = np.triu_indices(arr.shape[1])
     ...: out = np.concatenate((arr,axis=1)
1 loop,best of 3: 577 ms per loop

In [256]: %timeit pairwise_col_mult(arr)
1 loop,best of 3: 233 ms per loop

总结

以上是编程之家为你收集整理的python – 可变交互的计算(矩阵中向量的点积)全部内容,希望文章能够帮你解决python – 可变交互的计算(矩阵中向量的点积)所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶