This is a mess...

Nick Craig-Wood nick at craig-wood.com
Thu Jul 16 16:29:59 EDT 2009


Nick <nleioatt at gmail.com> wrote:
>  this is the new oop version, its pretty messy currently, and i do
>  understand it is a simple routine, but i'm using it as an exercise to
>  learn oop python...
> 
>  first the (current) traceback:
>   [:~/python]$  python oop_covariance.py b2ar_all_test b2ar_all_test
> <Eigen.Eigen_vect instance at 0x7fa26c404ab8>
> <Eigen.Eigen_vect instance at 0x7fa26c404ab8>
>  Traceback (most recent call last):
>    File "oop_covariance.py", line 24, in <module>
>      cov = set1.covariance(set2, Eigen_vect.dot)
>    File "/home/nleioatts/python/Eigen.py", line 66, in covariance
>      print self.vectors[i][i]
>  AttributeError: Eigen_vect instance has no attribute '__getitem__'

You are trying to use your Eigen_vect class as an array.  In order for
an object to act as an array it needs a __getitem__ method.

>  class Eigen_vect:
>      def __init__(self, e_val, e_vect):
>          self.e_val  = e_val
>          self.e_vect = e_vect
>      def length(self):
>          return len(self.e_vect)
> 
>      def dot(self, other):
>          d = 0.0
>          if other.length() != self.length():
>              raise ValueError, "Eigen Vectors not same Length"
>          for k in range(self.length()):
>             # print "HI NICK", self.e_vect[k], other.e_vect[k]
>              d += float(self.e_vect[k]) * float(other.e_vect[k])
>          return d

Either add a __getitem__ method like this

    def __getitem__(self, n):
        return self.e_vect[n]

Or you might want to subclass list if you are going to do a lot of
list like operations on Eigen_vects, eg

class Eigen_vect(list):
    def __init__(self, e_val, e_vect):
        self.e_val  = e_val
        self[:] = e_vect

    def dot(self, other):
        d = 0.0
        if len(other) != len(self):
            raise ValueError("Eigen Vectors not same Length")
        for a, b in zip(self, other):
            d += float(a) * float(b)
        return d

Notice that now these things are lists, you can use len, zip etc on
them which makes the code much neater.

e = Eigen_vect(3, range(10))
f = Eigen_vect(4, range(1,11))

print e
print f
print e[2]
print e.dot(f)

Which prints

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2
330.0

-- 
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick



More information about the Python-list mailing list