[SciPy-User] python lists in combination with numpy arrays

Martin van Leeuwen vanleeuwen.martin at gmail.com
Wed Nov 10 17:13:07 EST 2010


Thanks Josef,

You're right, putting

a = numpy.zeros(3, dtype=float)

inside the outer loop works fine, similar as appending a copy of a to
the list -- a.copy() -- instead of a itself.

Ah well.. Thanks so much!

Martin

2010/11/10  <josef.pktd at gmail.com>:
> On Wed, Nov 10, 2010 at 4:25 PM, Martin van Leeuwen
> <vanleeuwen.martin at gmail.com> wrote:
>> Dear All,
>>
>> I hope some of you could help me out understanding the following.
>> I am a little puzzled about something I found using numpy in
>> combination with standard python lists.
>> The following two methods give different outputs on my machine.
>> While the first method surprisingly overrides the python list instead
>> of appending, the second method appends as I would expect.
>> The only real difference between the methods is the line:
>>
>> for j in range(3): a[j] = numpy.random.rand()
>
> here a always stays the same object that get overwritten
>
>>
>> vs.
>>
>> a = numpy.random.rand(3)
>
> here a is a new object each time
>>
>>
>>
>> =============================
>> import numpy
>>
>> print "first method"
>>
>> lst=[]
>> a = numpy.zeros(3, dtype=float)
>> for i in range(2):
>>    for j in range(3): a[j] = numpy.random.rand()
>>    print "three random values:", a
>>    lst.append(a)
>>    print 'current list:', lst
>>    print '\n'
>>
>> print "second method"
>>
>> lst=[]
>> for i in range(2):
>>    a = numpy.random.rand(3)
>>    print "three random values:", a
>>    lst.append(a)
>>    print 'current list:', lst
>>    print '\n'
>>
>>
>> ==========IDLE output==========
>> first method
>> three random values: [ 0.87115972  0.26259606  0.34981352]
>> current list: [array([ 0.87115972,  0.26259606,  0.34981352])]
>>
>>
>> three random values: [ 0.48827773  0.91841208  0.81756918]
>> current list: [array([ 0.48827773,  0.91841208,  0.81756918]), array([
>> 0.48827773,  0.91841208,  0.81756918])]
>
> both entries of the list refer to the same array `a` that is
> overwritten in each outer loop
>
> my interpretation, I think it's the same behavior in this case if a
> were a list (?)
>
> Josef
>>
>>
>> second method
>> three random values: [ 0.88553281  0.92494531  0.34539655]
>> current list: [array([ 0.88553281,  0.92494531,  0.34539655])]
>>
>>
>> three random values: [ 0.87463742  0.49128832  0.89126926]
>> current list: [array([ 0.88553281,  0.92494531,  0.34539655]), array([
>> 0.87463742,  0.49128832,  0.89126926])]
>>
>>
>> ============================
>> As you can see, in the second iteration of the first method the first
>> entry in the list gets overridden with the new array, and the same
>> array then also get appended to that list. In the second method, the
>> new array gets appended to the list and the first entry of the list
>> remains as it was.
>>
>> Thanks for any help on this.
>>
>> Martin
>> _______________________________________________
>> 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
>



More information about the SciPy-User mailing list