【问题标题】:How to compute the number of 'True' valued matrices in a tensor?如何计算张量中“真”值矩阵的数量?
【发布时间】:2021-11-25 05:29:08
【问题描述】:

在以下维度 (5,1,5,5) 的张量中,我想计算所有值为“真”的 5*5(最内层)布尔矩阵的数量。 例如,

tf.constant([
 [[[ True,  True,  True,  True,  True],
   [False,  True, False,  True,  True],
   [False,  True, False,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True]]], 
    
 [[[ True,  True,  True,  True,  False],
   [False,  True,  True,  True,  True],
   [False,  True, False,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  False,  True,  True,  True]]],
            
 [[[ True,  True,  True,  True,  True],
   [False,  True, False,  True,  True],
   [False,  True,  True,  True,  True],
   [ True,  False,  True,  False,  True],
   [ True,  True,  True,  True,  True]]],
 
 [[[ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True]]],
             
 [[[ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True],
   [ True,  True,  True,  True,  True]]],
 
 ])

在上面的张量中,共有 5 个最里面的矩阵,维度为 5 x 5。其中 3 个矩阵包含“假”和“真”值,而最后 2 个矩阵仅包含“真”值。我需要计算只有“真”值的矩阵总数与同时具有“真”和“假”值的矩阵总数的比率。在这种情况下,它将是: 只有“真”值的矩阵总数/矩阵总数 = 2/5

我如何计算这个? 我能想到的一种方法是使用 tf.squeeze() 删除 1 维,然后将其转换为 numpy 数组,然后循环遍历它。但是,这不是优化的方法。我想使用 tensorflow(使用 tensor 数据类型而不是 numpy 数组)来做到这一点,因为这需要非常省时。

此外,我还想计算所有值为“真”的最内层行总数与总行数的比率。例如,在我们的例子中,它将是: 只有“真”值的总行数/总行数 = 16/25。 这也需要使用张量和高效的时间。

【问题讨论】:

    标签: python matrix tensorflow2.0 tensor


    【解决方案1】:

    我认为你需要 tf.reduce_all

    import tensorflow as tf
    temp_tesnor = tf.constant([
     [[[ True,  True,  True,  True,  True],
       [False,  True, False,  True,  True],
       [False,  True, False,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]]], 
        
     [[[ True,  True,  True,  True,  False],
       [False,  True,  True,  True,  True],
       [False,  True, False,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  False,  True,  True,  True]]],
                
     [[[ True,  True,  True,  True,  True],
       [False,  True, False,  True,  True],
       [False,  True,  True,  True,  True],
       [ True,  False,  True,  False,  True],
       [ True,  True,  True,  True,  True]]],
     
     [[[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]]],
                 
     [[[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]]],
     
     ])
    
    temp_tesnor.shape # TensorShape([5, 1, 5, 5])
    
    

    然后在维度为 1 的地方减少张量。

    temp_tesnor = tf.squeeze(temp_tesnor, axis = [1])
    temp_tesnor.shape # TensorShape([5, 5, 5])
    
    

    查询1的结果

    result1 = 0
    for i in temp_tesnor:
        if tf.reduce_all(i):
            result1 += 1
    print(result1)  # prints 2 . Divide here with your first dimension. here it is 5.
    

    query2 的结果

    result2 = 0
    for inner_tensor in temp_tesnor:
        for i in inner_tensor:
            if tf.reduce_all(i):
                result2 += 1
    print(result2) # prints 16 . divide here by multiplication of dimension 
    #of last two axis . here it is 5*5 = 25
    

    这一切都在 tensorflow 中完成。

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2023-02-18
      • 2021-08-07
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多