【问题标题】:Python - How to get the sum of the upper triangle of a matrix without using numpy?Python - 如何在不使用 numpy 的情况下获得矩阵上三角形的总和?
【发布时间】:2019-11-18 00:35:32
【问题描述】:

这个问题类似于this one,但我想知道如何在不使用 numpy 的情况下做到这一点。如何用纯Python获得矩阵的上三角形的夏天?例如,我有

matrix = [[1,  2,  3],
          [4,  5,  6],
          [7,  8,  9]]

我该如何返回:

upper = [2,3,6]
upperSum = 11
lower = [4,7,8]
lowerSum = 19

【问题讨论】:

  • 你有没有尝试过?您对这个算法问题的处理方法是什么?
  • 提示:matrix[0][1] == 2。现在,哪些索引对应于上三角形的每个元素?您将如何迭代它们?

标签: python


【解决方案1】:

对于方阵:实际上我认为即使对于非方阵,它的行为也是正确的。

>>> m
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> sum(( m[i][i+1:] for i in range(len(m)) ), [])
[2, 3, 6]
>>> sum(( m[i][:i] for i in range(len(m)) ), [])
[4, 7, 8]

(使用 sum-flatten hack)

>>> sum([[1, 2], [3, 4]], [])
[1, 2, 3, 4]

【讨论】:

    【解决方案2】:

    有代码示例:

    matrix = [[1,  2,  3],
              [4,  5,  6],
              [7,  8,  9]]
    upper = []
    lower = []
    for j in xrange(0, len(matrix)):
        for i in xrange(0, len(matrix)):
            if j>i:
                lower.append(matrix[j][i])
            elif j<i:
                upper.append(matrix[j][i])
            else:
                pass
    upperSum = sum(upper)
    lowerSum = sum(lower)
    

    【讨论】:

      【解决方案3】:

      请记住,这仅在每个子数组具有相同长度时才有效。

      def GetSum(array):
          total = 0
          #Set the default value of "total" to 0.
          for i in range(len(array)):
          #for every item in the array:
              total += array[i]
              #Append the current selected value in the array to the total.
          return total
          #Return the total
      try:
          length = len(matrix)
          #Get the length of the "matrix" array.
          rowlength = len(matrix[0])
          #Get the length of rows (the sub arrays within the main array).
          upper = [matrix[0][rowlength-2],matrix[0][rowlength-1],matrix[1][upperlength-1]]
          #Get the upper corner of the matrix array.
          uppersum = GetSum(upper)
          #Get the sum of all the items in "upper".
          lower = [matrix[length-2][0],matrix[length-1][0],matrix[length-1][1]]
          #Get the lower corner of the matrix array.
          lowersum = GetSum(lower)
          #Get the sum of all the items in "lower".
      except:
          print("Incorrect matrix dimensions :/")
          #print an error message
      

      【讨论】:

        【解决方案4】:
        upper = []
        [upper.extend(matrix[i][i+1:]) for i in range(len(matrix))]
        lower = []
        [lower.extend(matrix[i][0:i]) for i in range(len(matrix))]
        

        然后求和 :-)

        【讨论】:

          【解决方案5】:

          带有sum 和生成器表达式的单行代码:

          matrix = [[1,  2,  3],
                    [4,  5,  6],
                    [7,  8,  9]]
          
          size = 2
          sum(sum(matrix[i][-size+i:]) for i in xrange(size)) # 11
          sum(sum(matrix[-i-1][:size-i]) for i in xrange(size)) # 19
          

          【讨论】:

          • 大小变量是多少?
          • @JustinBrousseau:这是三角形的大小,在这种情况下,它定义我们从第一行中取出 2 个项目,在大三角形的情况下,我们将 [2, 3]
          【解决方案6】:

          你的对角线是矩阵[x][x]。所以你的上三角形是 matrix[x][x + n] 中的所有内容,其中 x

          所以基本上,只有两个 for 循环就可以了:

          for(i=0; i<matrix.length; i++){
              for(j=i+1; j < (matrix[x].length - x); j++){
                  //your code, here we iterate on the upper triangle
              }
          }
          

          我相信您现在会发现如何在下面的三角形上做同样的事情!

          【讨论】:

            【解决方案7】:
            A=np.random.randint(2,9,(6,6))
            upper = []
            lower = []
            for i in range(0,len(A)):
                upper.extend(A[i][i+1:])
                lower.extend(A[i][0:i])
            Uppersum = sum(upper)
            Lowersum = sum(lower)
            

            【讨论】:

            • 欢迎来到 Stack Overflow!虽然您所写的内容可能会回答这个问题,但在explanation 中似乎确实有些欠缺,并且可能会给其他用户造成非法混淆。您能否扩展您的答案,使其更清晰、更易于理解?这将提供更好的答案,并帮助未来的用户了解问题是如何解决的。
            猜你喜欢
            • 2018-04-29
            • 1970-01-01
            • 2018-06-08
            • 1970-01-01
            • 2014-11-16
            • 2013-05-02
            • 2011-06-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多