[SciPy-User] Mapping objects to numpy array

Jim Vickroy Jim.Vickroy at noaa.gov
Wed Aug 5 17:09:14 EDT 2009


josef.pktd at gmail.com wrote:
> On Wed, Aug 5, 2009 at 4:32 PM, Chris Colbert<sccolbert at gmail.com> wrote:
>   
>> You cannot use self.a, as this creates an instance attribute that
>> hides the class attribute. You have to access through the __class__
>> variable of the instance, or access the class attribute directly. See
>> below:
>>
>> In [7]: class Test(object):
>>   ...:     a = 1
>>   ...:     def __init__(self, val):
>>   ...:         self.b = val
>>   ...:
>>   ...:     def set(self, val):
>>   ...:         self.a = val
>>     
>
> here you are redefining `a`, turning it into an instance variable as you said.
> I guess, I was right in being worried about the issue.
>   
You only need be concerned if you wish to also introduce an instance 
attribute with the same name; otherwise, as you have discovered, it 
works as expected.
Even with an instance attribute of the same name, your class wide 
attribute is still readily accessible via the __class__ qualifier (e.g., 
self.__class__.a) or via the class name qualifier (e.g., Test.a).
> However, in my case `a` is a mutable array and my assignment is
>
>   def _setx(self, value):
>       self.a[self.k,0] = value
>
> Which just changes one value in an existing array, it would be the
> same if `a` where a python list.
>
> When I run my example with self.a, it works in the same way as with
> self.__class__.a
>
>
> all aa, p1.a, and p2.a are changed after the assignment p2.x = 10
>
> Josef
>
>   
>>   ...:
>>   ...:
>>
>> In [8]: t1 = Test(4)
>>
>> In [9]: t1.a
>> Out[9]: 1
>>
>> In [10]: t1.b
>> Out[10]: 4
>>
>> In [11]: t2 = Test(5)
>>
>> In [12]: t1.a
>> Out[12]: 1
>>
>> In [13]: t2.a
>> Out[13]: 1
>>
>> In [14]: t2.b
>> Out[14]: 5
>>
>> In [15]: t1.set(4)
>>
>> In [16]: t1.a
>> Out[16]: 4
>>
>> In [17]: t1.b
>> Out[17]: 4
>>
>> In [18]: t2.a
>> Out[18]: 1
>>
>> In [19]: t2.b
>> Out[19]: 5
>>
>> In [20]: t3 = Test(6)
>>
>> In [21]: t4 = Test(7)
>>
>> In [22]: t3.a
>> Out[22]: 1
>>
>> In [23]: t4.a
>> Out[23]: 1
>>
>> In [24]: Test.a = 9
>>
>> In [25]: t3.a
>> Out[25]: 9
>>
>> In [26]: t4.a
>> Out[26]: 9
>>
>>
>> On Wed, Aug 5, 2009 at 11:55 AM, <josef.pktd at gmail.com> wrote:
>>     
>>> On Wed, Aug 5, 2009 at 11:32 AM, Jim Vickroy<Jim.Vickroy at noaa.gov> wrote:
>>>       
>>>> josef.pktd at gmail.com wrote:
>>>>
>>>> On Wed, Aug 5, 2009 at 9:27 AM, Chris Colbert<sccolbert at gmail.com> wrote:
>>>>
>>>>
>>>> its for the same reason you cant do this:
>>>>
>>>> In [1]: a = 1
>>>>
>>>> In [2]: b = a
>>>>
>>>> In [3]: a
>>>> Out[3]: 1
>>>>
>>>> In [4]: b
>>>> Out[4]: 1
>>>>
>>>> In [5]: a = 2
>>>>
>>>> In [6]: a
>>>> Out[6]: 2
>>>>
>>>> In [7]: b
>>>> Out[7]: 1
>>>>
>>>>
>>>> but you CAN do this:
>>>>
>>>> In [8]: a = [1, 2]
>>>>
>>>> In [9]: b = a
>>>>
>>>> In [10]: a
>>>> Out[10]: [1, 2]
>>>>
>>>> In [11]: b
>>>> Out[11]: [1, 2]
>>>>
>>>> In [12]: a[0] = 0
>>>>
>>>> In [13]: a
>>>> Out[13]: [0, 2]
>>>>
>>>> In [14]: b
>>>> Out[14]: [0, 2]
>>>>
>>>>
>>>> floats and ints are immutables in python.
>>>> you'll need a mutable container to store the values how you are wanting.
>>>>
>>>> That said, you still cant map to them with a numpy array like you want
>>>> (AFAIK)
>>>>
>>>> You may want to look into subclassing ndarray or reformulating your
>>>> problem so you dont need this requirement.
>>>>
>>>>
>>>> On Wed, Aug 5, 2009 at 9:05 AM, Emmanuelle
>>>> Gouillart<emmanuelle.gouillart at normalesup.org> wrote:
>>>>
>>>>
>>>>        Hi Jack,
>>>>
>>>>        I don't think you can do it this way. The reason is that p1.x and
>>>> p1.v can be anywhere in the memory, maybe at very different places. So
>>>> np.array makes a *copy* when you pass ( p1.x, p1.v) as arguments. I tried
>>>> setting copy=False as a keyword argument of np.array but it doesn't
>>>> change the result; apparently a copy has to be made. Why don't you define
>>>> an array inside the class Particle, instead of different attributes?
>>>>
>>>>        Cheers,
>>>>
>>>>        Emmanuelle
>>>>
>>>> On Wed, Aug 05, 2009 at 02:44:18PM +0200, Jack Liddle wrote:
>>>>
>>>>
>>>> Hi
>>>>
>>>>
>>>> I'm trying to map some objects to a numpy array, so I can solve some
>>>> ode's with them and then work on the results with my objects.
>>>>
>>>>
>>>> Here's some code.
>>>>
>>>>
>>>> from numpy import array
>>>>
>>>>
>>>> class Particle(object):
>>>>    def __init__(self,x,v):
>>>>       self.x = x
>>>>       self.v = v
>>>>
>>>>
>>>> p1 = Particle(1,0)
>>>> a  = array(( p1.x, p1.v))
>>>> a[0] = 5
>>>> print p1.x
>>>>
>>>>
>>>> This prints 1 instead of 5.  How do I make the array 'a' share the
>>>> same memory as the p1 attributes?
>>>>
>>>>
>>>> Any ideas, hope this makes sense
>>>>
>>>>
>>>> Thanks
>>>>
>>>>
>>>> Jack Liddle
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>>
>>>> I was trying to do it from scratch, but I got confused about class
>>>> variables.
>>>> Can class variables only be accessed through the class self.__class__
>>>> ? I seem to get rusty in my python knowledge.
>>>>
>>>> the following seems to do what Emmanuelle proposed, but there might be
>>>> better examples already in the mailing lists.
>>>>
>>>> Josef
>>>>
>>>>
>>>> class Particle(object):
>>>>   a  = np.empty((3,2))
>>>>
>>>>
>>>>         
>>>> The above definition means that all instances of your Particle class will
>>>> share the same "a".
>>>> If you create instances p1 = Particle(0,1,2) and p2 = Particle(3,4,5), p1.a
>>>> and p2.a reference the same "a".
>>>> Is that your intent?
>>>>         
>>> Yes, that's the point of the exercise, to have the data of all
>>> particles accessible through one array, and the individual data points
>>> accessible through the instance attribute.
>>>
>>>       
>>>>   def __init__(self,k,x,v):
>>>>      self.k = k
>>>>      #why do I need self.__class__ for class variable
>>>>
>>>>
>>>> self.a should work just fine.  Did you try it without specifying the
>>>> __class__ qualifier?
>>>>         
>>> Thanks for the hint.
>>> Yes, it works, and no, I didn't try.
>>> I was worried about class versus instance variable, the python help
>>> only used the class to access the class variable, and I didn't want to
>>> spend too much time on the exercise.
>>>
>>> When I actually need it, I will worry about the other details, like
>>> how to preallocate and grow the class array `a` and to automatically
>>> assign indices.
>>>
>>> Josef
>>>
>>>
>>>       
>>>>      self.__class__.a[k,0] = x
>>>>      self.__class__.a[k,1] = v
>>>>
>>>>   def _getx(self):
>>>>       return self.__class__.a[self.k,0]
>>>>   def _setx(self, value):
>>>>       self.__class__.a[self.k,0] = value
>>>>
>>>>   x = property(_getx, _setx)
>>>>
>>>>
>>>> aa  = Particle.a
>>>> print aa
>>>> p1 = Particle(0, 1, 2)
>>>> print p1
>>>> p2 = Particle(1, 2, 3)
>>>> p3 = Particle(2, 3, 4)
>>>> print aa
>>>> aa[:,:] = 1
>>>> print aa
>>>> print p2._getx(), p2.x
>>>> aa[0,0] = 5
>>>> print p1.x
>>>> p2.x = 10
>>>> print aa
>>>> print Particle.a
>>>> print vars(p2)
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>>         
>>> _______________________________________________
>>> SciPy-User mailing list
>>> SciPy-User at scipy.org
>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>
>>>       
>> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User at scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>
>>     
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20090805/06a0db14/attachment.html>


More information about the SciPy-User mailing list