[英]Applying a function to every element in a numpy matrix
我有一个函数,可以计算两个元素之间的调整余弦相似度,就像这样:
def sim(x,y,M):
filtered = M[(M[:, x] > 0) & (M[:, y] > 0)]
m = np.average(filtered, axis=1, weights=filtered.astype(bool))
i = filtered[:, x] - m
j = filtered[:, y] - m
return np.sum(i * j) / (np.linalg.norm(i) * np.linalg.norm(j))
我也有一个* n矩阵,我想为其每对获取sim(),即0,0-n,n。 目前,我正在使用两个for循环进行此操作,效果很好,但速度相当慢:
def get_matrix(M):
new_mat = []
for x in range(3):
for y in range(3):
new_mat.append(sim(x,y,M))
return np.reshape(new_mat, (3,3))
有没有更有效的方法可以做到这一点? M( mn )和mat( nn )的尺寸不同。
编辑:
我的M看起来像这样:
[[ 0. 100. 300.]
[ 100. 200. 0.]
[ 250. 150. 0.]
[ 250. 200. 0.]]
在这种情况下,作为输出,我想要一个3x3大小的矩阵(new_mat),其中包含每个项目之间的相似之处,并简化了:
[[ 1. -1. -1.]
[ -1. 1. -1.]
[ -1. -1. 1.]]
好吧,让我们最后拥有它,因为它比预期的要复杂得多! 因此,这是一种矢量化方法,可在各个地方使用broadcasting
-
avg = M.sum(1)/((M>0).sum(1))
mask = M>0
subs = M - avg[:,None]
masked_subs = mask*subs
sums = np.dot(masked_subs.T,masked_subs)
comb_mask = mask[:,None,:] & mask[:,:,None]
norm_i = np.linalg.norm(subs[:,:,None]*comb_mask, axis=0)
norm_j = np.linalg.norm(subs[:,None,:]*comb_mask, axis=0)
out = sums/(norm_i*norm_j)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.