[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