# [Numpy-discussion] Distance Formula on an Array

Eike Welk eike.welk@gmx....
Sun Apr 26 15:56:08 CDT 2009

```Hello Ian!

On Saturday 25 April 2009, Ian Mallett wrote:
> Can I make "vec" an array of class instances?  I tried:
> class c:
>     def __init__(self):
>         self.position = [0,0,0]
> vec = array([c(),c(),c()])
> pos = array([0,4,0])
> sqrt(((vec.position - pos)**2).sum(1))
>
> Which doesn't work.  I'm not familiar with class objects in
> arrays--how should they be referenced?

You could use objects that don't store the positions but who know how
to access them. The positions are stored in a Numpy array, the
objects store only the index to the array.
This is similar to the flyweight design pattern. Here is an example
class:

from numpy import array

class MyThing(object):
position_array = array([], 'd')

def __init__(self, index):
self.index = index

def get_position(self):
return MyThing.position_array[self.index]
def set_position(self, new_val):
MyThing.position_array[self.index] = new_val

position = property(get_position, set_position, None,
'Position of MyThing, stored collectively for all objects in '
'MyThing.position_array.')

#--------- Use the MyThig class ------------------------------
#fill the array of positions with data
MyThing.position_array = array([[0,0,0], [0,1,0], [0,0,3]], 'd')

#create instance at index 1
thing1 = MyThing(1)
print thing1.get_position()
print thing1.position
assert (thing1.position == array([0,1,0])).all()

#create instance at index 2
thing2 = MyThing(2)
print thing2.position
assert (thing2.position == array([0,0,3])).all()
thing2.position = array([1,2,3])
print thing2.position
assert (thing2.position == array([1,2,3])).all()

Kind regards,
Eike.
```