Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将张量元素划分为特定的索引_Python_Tensorflow - Fatal编程技术网

Python 如何将张量元素划分为特定的索引

Python 如何将张量元素划分为特定的索引,python,tensorflow,Python,Tensorflow,我有一个像这样的张量: out = [[ 3, 6, 5, 4], [ 6, 5, 10, 13], [ 5, 10, 6, 22], [ 4, 13, 22, 9]] [[3 , 6/(3*5) , 5/(3*6) , 4/(3*9) ] [6/(3*5), 5 , 10/(5*6), 13/(5*9)] [5/(3*6), 10/(5*6), 6 , 22/(6*9)] [4/(

我有一个像这样的张量:

out = [[ 3,  6,  5,  4],
       [ 6,  5, 10, 13],
       [ 5, 10,  6, 22],
       [ 4, 13, 22,  9]]
[[3      ,  6/(3*5) ,  5/(3*6) ,  4/(3*9) ]
 [6/(3*5),  5       ,  10/(5*6),  13/(5*9)]
 [5/(3*6),  10/(5*6),  6       ,  22/(6*9)]
 [4/(3*9),  13/(5*9),  22/(6*9),  9       ]]
这是一个对称矩阵。我想做的是将每个元素除以对角线的相同索引中的值。因此,该矩阵中对角线的值为:

index0 = 3
index1 = 5
index2 = 6
index3 = 9
结果如下所示:

out = [[ 3,  6,  5,  4],
       [ 6,  5, 10, 13],
       [ 5, 10,  6, 22],
       [ 4, 13, 22,  9]]
[[3      ,  6/(3*5) ,  5/(3*6) ,  4/(3*9) ]
 [6/(3*5),  5       ,  10/(5*6),  13/(5*9)]
 [5/(3*6),  10/(5*6),  6       ,  22/(6*9)]
 [4/(3*9),  13/(5*9),  22/(6*9),  9       ]]
让我走过第一排:

3
是对角线中的值,因此我们将跳过它

6/3*5
6
索引0和1处的值,因此我将
6
除以
index0和1中的对角线值

5/3*6
5
是索引
0和2的值,因此我将其除以索引
0和2的对角线值


4/3*9
4
是索引
0和3
处的值,因此我将其除以索引
0和3
处的对角线值,使用numpy,您可以执行以下操作:

import numpy as np

out = out.astype(float)
# diagonal elements in out
d = np.copy(np.diagonal(out))
# Indices of lower triangular matriX
tril_ix = np.tril_indices_from(out, k=-1)
# cumulative sum of the diagonal values
# over the first axis on a square matrix
dx = np.cumsum(np.diag(d), 1) 
# replicate ove lower triangular
dx[tril_ix] += np.rot90(dx, k=1)[::-1][tril_ix]
# same but accumulating the diagonal elements
# upwards on the y axis
dy = np.cumsum(np.diag(d)[::-1],0)[::-1]
# replicate ove rlower triangular
dy[tril_ix] += np.rot90(dy, k=1)[::-1][tril_ix]
# mask where to apply the product
m = dy!=0
# perform div and mult
out[m] = out[m]/(dx[m]*dy[m])
np.fill_diagonal(out, d)


可以在tensorflow(或numpy)中按如下方式执行

  • 我们取原始矩阵,然后从对角线上取零
  • 我们将得到的矩阵除以对角向量
  • 我们将2的结果转置,再除以对角向量
  • 我们添加了我们在步骤1中调零的对角线
  • 将tensorflow导入为tf
    out=[[3,6,5,4],
    [ 6,  5, 10, 13],
    [ 5, 10,  6, 22],
    [ 4, 13, 22,  9]]
    张量=tf.constant(out,dtype=tf.float32)
    diag_index=tf.tile(tf.range(tf.shape(tensor)[0])[…,None],[1,2])
    diag=tf.gather_nd(张量,diag_索引)#[3.5.6.9]
    diag_矩阵=tf.linalg.tensor_diag(diag)
    零对角矩阵=张量对角矩阵
    res=tf.转置(零对角矩阵/对角)/对角+对角矩阵
    使用tf.Session()作为sess:
    打印(res.eval())
    # [[3.         0.4        0.27777776 0.14814815]
    #  [0.4        5.         0.33333334 0.28888887]
    #  [0.27777776 0.3333333  6.         0.4074074 ]
    #  [0.14814815 0.28888887 0.4074074  9.        ]]
    
    这是tensorflow版本

    将tensorflow导入为tf
    将numpy作为np导入
    out=tf.变量([[3,6,5,4],
    [ 6,  5, 10, 13],
    [ 5, 10,  6, 22],
    [4,13,22,9]],dtype=tf.float32)
    #此解决方案仅适用于平方矩阵
    断言out.shape[-2]==out.shape[-1]
    out\u diag=tf.linalg.diag\u零件(out)
    res=tf.Variable(tf.zeros(out.shape,dtype=tf.float32))
    对于tf.范围内的i(out.shape[0]):
    _=res[…,(i+1):,i].赋值(out[…,(i+1):,i]/out\u diag[…,(i+1):]/out\u diag[…,i])
    _=res[…,i,(i+1):]赋值(out[…,i,(i+1):]/out_diag[…,(i+1):]/out_diag[…,i])
    打印(res)
    
    在解决此问题时,tensorflow不支持将项目分配给tensor切片,这令人震惊。嗯,努比做到了!你知道如何在tensorflow中以矢量化的方式解决它吗?不,我不知道足够的tf,我希望你能找到一个有用的numpy方法:)@TirthPatelsure,这很有用,但tensorflow通常是在GPU上的深度学习或机器学习模型中执行自动微分的一个选择。我认为tensorflow只能通过使用tensorflow函数对tensorflow张量执行的操作来区分。numpy操作中断自动差异库以执行差异化。一旦tensorflow版本支持tensor切片上的项目分配,那就太好了。我自己也很困惑。让我们把它留给一些tf老手:)看看我的解决方案,伙计们。同样的道理也适用于numpy。太棒了!很simpler@Vlad非常感谢你,我想知道我们可以用
    scatter\u nd
    也这样做吗?@sariii,不是用任何琐碎的方式。我认为这只会使事情变得过于复杂。我知道我曾试图通过
    scatter\u nd
    来做到这一点,但未能做到。您的解决方案看起来简单易懂,再次感谢:)太感谢您了,出于某种原因,我无法使用
    For loop
    ,但感谢您发布解决方案you's Welcome@sarii
    tf.for
    loop在Windows和Linux机器上的tensorflow 2.x版本中适用于我。你用的是什么tensorflow版本?我用的是
    TF14
    ,原因是我的矩阵会很大。我不想重复性能问题的原因