dot operations

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • jm.suresh@no.spam.gmail.com

    #1

    dot operations

    Hi,
    Frequently I get to do like this:
    a = (1, 2, 3, 4) # some dummy values
    b = (4, 3, 2, 1)
    import operator
    c = map(operator.ad d, a, b)

    I am finding the last line not very readable especially when I combine
    couple of such operations into one line. Is it possible to overload
    operators, so that, I can use .+ for element wise addition, as,
    c = a .+ b
    which is much more readable.

    Similarly, I want to use .- , .*, ./ . Is it possible to do?

    thanks.

    -
    Suresh

  • robert

    #2
    Re: dot operations

    jm.suresh@no.sp am.gmail.com wrote:
    Hi,
    Frequently I get to do like this:
    a = (1, 2, 3, 4) # some dummy values
    b = (4, 3, 2, 1)
    import operator
    c = map(operator.ad d, a, b)
    >
    I am finding the last line not very readable especially when I combine
    couple of such operations into one line. Is it possible to overload
    operators, so that, I can use .+ for element wise addition, as,
    c = a .+ b
    which is much more readable.
    >
    Similarly, I want to use .- , .*, ./ . Is it possible to do?
    import numpy

    You'll not even need dots

    Comment

    • Paddy

      #3
      Re: dot operations


      jm.suresh@no.sp am.gmail.com wrote:
      Hi,
      Frequently I get to do like this:
      a = (1, 2, 3, 4) # some dummy values
      b = (4, 3, 2, 1)
      import operator
      c = map(operator.ad d, a, b)
      >
      I am finding the last line not very readable especially when I combine
      couple of such operations into one line. Is it possible to overload
      operators, so that, I can use .+ for element wise addition, as,
      c = a .+ b
      which is much more readable.
      >
      Similarly, I want to use .- , .*, ./ . Is it possible to do?
      >
      thanks.
      >
      -
      Suresh
      List comprehensions?
      >>a = (1, 2, 3, 4)
      >>b = (4, 3, 2, 1)
      >>import operator
      >>c = map(operator.ad d, a, b)
      >>c
      [5, 5, 5, 5]
      >>c1 = [a1+b1 for a1,b1 in zip(a,b)]
      >>c1
      [5, 5, 5, 5]
      >>>

      - Paddy.

      Comment

      • jm.suresh@no.spam.gmail.com

        #4
        Re: dot operations


        Paddy wrote:
        jm.suresh@no.sp am.gmail.com wrote:
        Hi,
        Frequently I get to do like this:
        a = (1, 2, 3, 4) # some dummy values
        b = (4, 3, 2, 1)
        import operator
        c = map(operator.ad d, a, b)

        I am finding the last line not very readable especially when I combine
        couple of such operations into one line. Is it possible to overload
        operators, so that, I can use .+ for element wise addition, as,
        c = a .+ b
        which is much more readable.

        Similarly, I want to use .- , .*, ./ . Is it possible to do?

        thanks.

        -
        Suresh
        >
        List comprehensions?
        >
        >a = (1, 2, 3, 4)
        >b = (4, 3, 2, 1)
        >import operator
        >c = map(operator.ad d, a, b)
        >c
        [5, 5, 5, 5]
        >c1 = [a1+b1 for a1,b1 in zip(a,b)]
        >c1
        [5, 5, 5, 5]
        >>
        >
        I just found this from :


        class Infix(object):
        def __init__(self, function):
        self.function = function
        def __ror__(self, other):
        return Infix(lambda x, self=self, other=other:
        self.function(o ther, x))
        def __or__(self, other):
        return self.function(o ther)
        def __rlshift__(sel f, other):
        return Infix(lambda x, self=self, other=other:
        self.function(o ther, x))
        def __rshift__(self , other):
        return self.function(o ther)
        def __call__(self, value1, value2):
        return self.function(v alue1, value2)

        import operator
        dotplus = Infix(lambda x,y: map(operator.ad d, x, y))

        a = range(4)
        b = range(4)

        c = a |dotplus| b
        >
        - Paddy.

        Comment

        • Steven W. Orr

          #5
          Re: dot operations

          On Thursday, Jan 11th 2007 at 11:41 +0100, quoth robert:

          =>jm.suresh@no. spam.gmail.com wrote:
          =>Hi,
          => Frequently I get to do like this:
          =>a = (1, 2, 3, 4) # some dummy values
          =>b = (4, 3, 2, 1)
          =>import operator
          =>c = map(operator.ad d, a, b)
          =>>
          =>I am finding the last line not very readable especially when I combine
          =>couple of such operations into one line. Is it possible to overload
          =>operators, so that, I can use .+ for element wise addition, as,
          =>c = a .+ b
          =>which is much more readable.
          =>>
          =>Similarly, I want to use .- , .*, ./ . Is it possible to do?
          =>
          =>import numpy
          =>
          =>You'll not even need dots

          I'm very new so my plea to be gentle is still on.

          I just looked at the numpy package. Seems very cool, but for the life of
          me I didn't understand the method by which python allows for creation of
          infix operators. Can someone please explain or point me to a reference?

          TIA

          --
          Time flies like the wind. Fruit flies like a banana. Stranger things have .0.
          happened but none stranger than this. Does your driver's license say Organ ..0
          Donor?Black holes are where God divided by zero. Listen to me! We are all- 000
          individuals! What if this weren't a hypothetical question?
          steveo at syslang.net

          Comment

          • Steven D'Aprano

            #6
            Re: dot operations

            On Thu, 11 Jan 2007 06:06:39 -0800, jm.suresh@no.sp am.gmail.com wrote:
            >jm.suresh@no.sp am.gmail.com wrote:
            Hi,
            Frequently I get to do like this:
            a = (1, 2, 3, 4) # some dummy values
            b = (4, 3, 2, 1)
            import operator
            c = map(operator.ad d, a, b)
            >
            I am finding the last line not very readable especially when I combine
            couple of such operations into one line. Is it possible to overload
            operators, so that, I can use .+ for element wise addition, as,
            c = a .+ b
            which is much more readable.
            [snip]
            I just found this from :

            >
            class Infix(object):
            [snip code]
            c = a |dotplus| b

            Personally, I find that to be the least readable of all the alternatives.
            It is also slow, so slow that using it is (in my opinion) a pessimation
            rather than an optimization.

            Let me make the usual warnings about premature optimization being
            the root of all evil, blah blah blah. Readability counts, and nobody cares
            if you shave one hundredth of a millisecond off some code that your
            program runs once. But, having said that, map is *fast*, especially with
            the functions from operator.
            >>import timeit
            >>timeit.Timer( "map(operator.a dd, a, b)",
            .... "import operator; a = (1, 2, 3, 4); b = (4, 3, 2, 1)").timeit()
            4.0072550773620 605

            It is even faster if you get rid of the dot lookup:
            >>timeit.Timer( "map(add, a, b)", "from operator import add; "
            .... "a = (1, 2, 3, 4); b = (4, 3, 2, 1)").timeit()
            3.6557090282440 186

            Using lambda can be much slower:
            >>timeit.Timer( "map(lambda x,y: x+y, a, b)",
            .... "a = (1, 2, 3, 4); b = (4, 3, 2, 1)").timeit()
            6.1221940517425 537

            A list comprehension is in the middle, speed-wise:
            >>timeit.Timer( "[x+y for x,y in zip(a,b)]",
            .... "a = (1, 2, 3, 4); b = (4, 3, 2, 1)").timeit()
            5.0318419933319 092

            But the Infix recipe is slower than a wet week:
            >>timeit.Timer( "a|dotplus| b",
            .... "a = (1, 2, 3, 4); b = (4, 3, 2, 1); "
            .... "from __main__ import dotplus").timei t()
            15.195909976959 229


            Speaking for myself, I find list comprehensions to be the most readable of
            the alternatives and the most Pythonic.



            --
            Steven.

            Comment

            • Dan Bishop

              #7
              Re: dot operations

              On Jan 11, 10:21 am, "Steven W. Orr" <ste...@syslang .netwrote:
              On Thursday, Jan 11th 2007 at 11:41 +0100, quoth robert:
              >
              =>jm.sur...@no. spam.gmail.com wrote:=>Hi,
              => Frequently I get to do like this:
              =>a = (1, 2, 3, 4) # some dummy values
              =>b = (4, 3, 2, 1)
              =>import operator
              =>c = map(operator.ad d, a, b)
              =>>
              =>I am finding the last line not very readable especially when I combine
              =>couple of such operations into one line. Is it possible to overload
              =>operators, so that, I can use .+ for element wise addition, as,
              =>c = a .+ b
              =>which is much more readable.
              =>>
              =>Similarly, I want to use .- , .*, ./ . Is it possible to do?
              =>
              =>import numpy
              =>
              =>You'll not even need dots
              >
              I'm very new so my plea to be gentle is still on.
              >
              I just looked at the numpy package. Seems very cool, but for the life of
              me I didn't understand the method by which python allows for creation of
              infix operators. Can someone please explain or point me to a reference?
              Python doesn't allow the creation of new operators, but you can
              overload the existing ones (except for "and" and "or"). This is done
              by implementing the methods __add__, __sub__, __mul__, etc.



              Comment

              Working...