Suggestions for optimizing my code

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • drife

    #1

    Suggestions for optimizing my code

    Hello,

    I am looking for suggestions for how I might optimize my
    code (make it execute faster), and make it more streamlined/
    elegent. But before describing my code, I want to state that
    I am not a computer scientist (I am an atmospheric scientist),
    and have but a rudimentary understanding of OO principles.

    My problem is this: I want to find the maximum off-diagonal
    element of a correlation matrix, and the -position- of that
    element within the matrix. In case you are unfamiliar with
    correlation matrices they are square and symmetric, and contain
    the mutual correlations among data collected at different
    points in space or time.

    I write much Python code and absolutely love the language. To
    do the task outlined above I twiddled around with the "argsort"
    methods available in both Numeric and numarry. In the end, I
    decided to accomplish this through the following algorithm.

    <----

    import MLab
    import Numeric as N

    def FindMax( R):
    """Find row (column) where max off-diagonal element
    occurs in matrx [R].
    """
    # First get elements in the lower triangle of [R],
    # since the diagonal elements are uninformative and
    # the upper triangle contains redundant information.
    Y = MLab.tril(R)

    offMax = -9999.
    rowMax = 0
    colMax = 0

    for row in range(len(Y)):
    for col in range(0,row):
    if Y[row][col] > offMax:
    offMax = Y[row][col]
    rowMax = row
    colMax = col

    return (rowMax, colMax, offMax)

    ---->

    Now, this algorithm will work sufficiently fast on "small" sized
    matrices, but I worry that performance will not scale well when
    the dimensions of the matrix grow "large" (say 1000-1500 elements
    on a side, or larger).

    So onto my question. Could someone please provide me with a suggestion
    for making this code more efficient and elegant? Again, I have but
    a rudimentary understanding of OO principles.


    Thanks very much for your help,


    Daran


    daranrifeNOS@PA Myahoo.com

  • Wojciech Mula

    #2
    Re: Suggestions for optimizing my code

    drife wrote:[color=blue]
    > [...]
    > for row in range(len(Y)):
    > for col in range(0,row):[/color]

    In this case you should use 'xrange' instead 'range'.

    w.

    Comment

    • Robert Kern

      #3
      Re: Suggestions for optimizing my code

      drife wrote:[color=blue]
      > Hello,
      >
      > I am looking for suggestions for how I might optimize my
      > code (make it execute faster), and make it more streamlined/
      > elegent. But before describing my code, I want to state that
      > I am not a computer scientist (I am an atmospheric scientist),
      > and have but a rudimentary understanding of OO principles.
      >
      > My problem is this: I want to find the maximum off-diagonal
      > element of a correlation matrix, and the -position- of that
      > element within the matrix. In case you are unfamiliar with
      > correlation matrices they are square and symmetric, and contain
      > the mutual correlations among data collected at different
      > points in space or time.[/color]

      import MLab
      import Numeric as N

      def find_max(R):
      U = MLab.triu(R)
      n = U.shape[0]
      # set the diagonal elements to 0.0, too
      U.flat[::n+1] = 0.0
      k = N.argmax(U.flat )
      i, j = divmod(k, n)
      return i, j, R[i,j]

      --
      Robert Kern
      rkern@ucsd.edu

      "In the fields of hell where the grass grows high
      Are the graves of dreams allowed to die."
      -- Richard Harter

      Comment

      Working...