Python 如何在tensorflow中按元素将张量的每一行与其余行相乘

Python 如何在tensorflow中按元素将张量的每一行与其余行相乘,python,tensorflow,Python,Tensorflow,我有一个像这样的张量: tf_docs = tf.constant([[0, 2, 1], [1, 2, 2], [2, 1, 3], [5, 2, 2]], dtype=tf.int32) 我需要将每一行乘以其余的行,按元素计算,然后将结果相加 当第一行完成时,我们将处理第二行和其他行,并且 结果是这样的:它将是4*4,因为我们有4行 result_tf

我有一个像这样的张量:

tf_docs = tf.constant([[0, 2, 1],
                       [1, 2, 2],
                       [2, 1, 3],
                       [5, 2, 2]], dtype=tf.int32)
我需要将每一行乘以其余的行,按元素计算,然后将结果相加

当第一行完成时,我们将处理第二行和其他行,并且

结果是这样的:它将是
4*4
,因为我们有4行

result_tf =[[0,  6,  5, 6 ],
            [6,  0, 10, 13],
            [5, 10,  3, 18],
            [6,  13, 18, 0]]
让我解释一下
结果中的每个元素(矩阵是对称的)

第一行:

0*1 + 2*2 + 1*2 = 6
0*2 + 2*1 + 1*3 = 5
0*5 + 2*2 + 1*2 = 6
第二排:

1*2 + 2*1 + 2*3 = 10
1*5 + 2*2 + 2*2 = 13
第三排:

2*5 + 1*2 + 3*2 = 18
这就是我如何形成矩阵的上边

则diag中的值为:

(0,0)
在任何列中都没有
同时出现
,因此
0

(1,1)
在任何列中都没有
同时发生
,因此
0

(2,2)
在第二列中出现了2次
co,在第三列中出现了1次
so
3

(3,3)
未同时出现在任何列中,因此
0

我觉得这需要更多的创造力来解决,而不是了解技术。(如果你知道共现的概念,我在计算同一矩阵上的共现)

我所做的:

我可以使用for循环轻松地完成这项工作。但我需要使用tensorflow操作来完成。我找不到任何类似的问题。
我也在考虑每次使用“聚集”获取指定的行并对其进行聚集。但这种方法不是动态的,而且我的行和列都大于此值,因此此解决方案不可行。

以下是一种方法:

将tensorflow导入为tf
tf_docs=tf.常数([[0,2,1],
[1, 2, 2],
[2, 1, 3],
[5,2,2]],dtype=tf.int32)
#非对角元素
nondiag=tf.matmul(tf_docs,tf_docs,transpose_b=True)
#计算对角线
r=tf.range(tf.shape(tf\u docs,out\u type=tf\u docs.dtype)[0])
#将每个索引与每个值进行比较
cmp=tf.equal(tf.expand_dims(tf_docs,轴=-1),r)
#计算每列中每个索引的出现次数
count=tf.math.count\u非零(cmp,axis=0,dtype=tf\u docs.dtype)
#一次以上的总出现次数
diag=tf.减少总和(tf.最大值(计数-1,0),轴=0)
#设置对角元素
结果=tf.linalg.set诊断(非诊断,诊断)
打印(结果\u tf.numpy())
# [[ 0  6  5  6]
#  [ 6  0 10 13]
#  [ 5 10  3 18]
#  [ 6 13 18  0]]

非常感谢您的帮助,您真是太棒了。非常感谢您耐心地回答我的问题。我通常会复习答案,以便下次能够自己解决问题。我仍然没有掌握tensorflow的技能。我理解您的解决方案(除了您如何提出
cmp
部分)但当出现新问题时,我无法解决:|我认为这可能需要时间和更多的练习:),我几乎就要完成这个项目了:)@sarii很高兴它有帮助。
cmp
张量是一个三维张量,使得
cmp[i,j,k]
True
如果
tfu-docs[i,j]
k
则为
False
。这是一个全面的比较,这不是超级有效的,但希望它可以为你工作。我相信你每天都会在TF的帮助下变得更好,我感谢你的努力,让问题变得非常清楚,这些问题对于任何人来说都是困难的,无论是否有经验。如果需要,请不要犹豫,继续问下去,这就是问题的关键。你介意看看我的问题吗。有人已经回答了,答案有点正确,但形状不正确。再次感谢:)