繁体   English   中英

将函数应用于numpy矩阵中的每个元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM