如果我将矢量x(1,n)与其自身相乘,即np.dot(x.T,x),我将得到二次形式的矩阵.
如果我有一个矩阵Xmat(k,n),我怎样才能有效地计算行方点积并只选择上三角形元素?
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?
最佳答案
方法#1
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。