numpy.frombuffer != unpack() ??

Gary Herron gherron at islandtraining.com
Fri May 16 20:08:20 EDT 2008


Marlin Rowley wrote:
> All:
>  
> Say I have an array:
>  
> a = (['rrrrggggbbbbaaaa'],['rrrrggggbbbbaaaa'])
>  
> How do I make it so that I now have:
>  
> starting with first element (a[0])
> new_arr[0] = 'r'
> new_arr[1] = 'g'
> new_arr[2] = 'b'
> new_arr[3] = 'a'
> new_arr[4] = 'r'
> .....
>  
> continuing "through" a[1] with the same new_arr
> new_arr[N] = 'r'
> new_arr[N+1] = 'g'
> ....
>  
> -M

Numpy can do this for you.  First, do you really mean the array to 
contain lists of one string each?  If so:

 >>> import numpy
 >>> a = (['rrrrggggbbbbaaaa'],['rrrrggggbbbbaaaa'])
 >>> b = numpy.frombuffer(''.join(sum(a,[])),dtype='S1')  # Kind of a 
kludge here
 >>> b
array(['r', 'r', 'r', 'r', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'a',
       'a', 'a', 'a', 'r', 'r', 'r', 'r', 'g', 'g', 'g', 'g', 'b', 'b',
       'b', 'b', 'a', 'a', 'a', 'a'],
      dtype='|S1')
 >>> b.shape=(2,4,4)
 >>> b
array([[['r', 'r', 'r', 'r'],
        ['g', 'g', 'g', 'g'],
        ['b', 'b', 'b', 'b'],
        ['a', 'a', 'a', 'a']],

       [['r', 'r', 'r', 'r'],
        ['g', 'g', 'g', 'g'],
        ['b', 'b', 'b', 'b'],
        ['a', 'a', 'a', 'a']]],
      dtype='|S1')
 >>> c = b.transpose((2,0,1))
 >>> c
array([[['r', 'g', 'b', 'a'],
        ['r', 'g', 'b', 'a']],

       [['r', 'g', 'b', 'a'],
        ['r', 'g', 'b', 'a']],

       [['r', 'g', 'b', 'a'],
        ['r', 'g', 'b', 'a']],

       [['r', 'g', 'b', 'a'],
        ['r', 'g', 'b', 'a']]],
      dtype='|S1')
 >>> d=c.copy() # To make it contiguous
 >>> d.shape = (32,)
 >>> d
array(['r', 'g', 'b', 'a', 'r', 'g', 'b', 'a', 'r', 'g', 'b', 'a', 'r',
       'g', 'b', 'a', 'r', 'g', 'b', 'a', 'r', 'g', 'b', 'a', 'r', 'g',
       'b', 'a', 'r', 'g', 'b', 'a'],
      dtype='|S1')

Done.  Cool no?

Gary Herron

>
>
>
>
>     ------------------------------------------------------------------------
>     From: marlin_rowley at hotmail.com
>     To: robert.kern at gmail.com; python-list at python.org
>     Subject: RE: numpy.frombuffer != unpack() ??
>     Date: Fri, 16 May 2008 17:31:30 -0500
>
>     Thank you!  That solved it!
>      
>     -M
>
>
>     ------------------------------------------------------------------------
>
>     > To: python-list at python.org
>     > From: robert.kern at gmail.com
>     > Subject: Re: numpy.frombuffer != unpack() ??
>     > Date: Fri, 16 May 2008 17:25:00 -0500
>     >
>     > Marlin Rowley wrote:
>     > > All:
>     > >
>     > > I'm getting different floating point values when I use numpy
>     vs. unpack().
>     > >
>     > > frgba = numpy.frombuffer(<string of bytes>, dtype=float32)
>     > > buffer = unpack("!f", byte)
>     > >
>     > > frgba[0] != buffer[0]
>     > >
>     > > why? This is forcing me use the unpack() function since it's
>     giving me
>     > > the correct values. What am I doing wrong?
>     >
>     > Endianness, perhaps? '!' specifies big-endian data (an alias for
>     '>'). Most
>     > likely, you are on a little-endian platform. All of the dtypes
>     in numpy default
>     > to the native-endianness unless specified. If you want to read
>     big-endian data
>     > using numpy, do this:
>     >
>     > frgba = numpy.frombuffer(<string of bytes>, dtype='>f')
>     >
>     > If you have any more problems with numpy, please join us on the
>     numpy mailing
>     > list. When reporting problems, please try to provide a small but
>     complete
>     > snippet of self-contained code, the output that you got, and
>     explain the output
>     > that you expected to get. Thank you.
>     >
>     > http://www.scipy.org/Mailing_Lists
>     >
>     > --
>     > Robert Kern
>     >
>     > "I have come to believe that the whole world is an enigma, a
>     harmless enigma
>     > that is made terrible by our own mad attempt to interpret it as
>     though it had
>     > an underlying truth."
>     > -- Umberto Eco
>     >
>     > --
>     > http://mail.python.org/mailman/listinfo/python-list
>
>
>     ------------------------------------------------------------------------
>     E-mail for the greater good. Join the i’m Initiative from
>     Microsoft.
>     <http://im.live.com/Messenger/IM/Join/Default.aspx?source=EML_WL_%20GreaterGood>
>
>
>
> ------------------------------------------------------------------------
> E-mail for the greater good. Join the i’m Initiative from Microsoft. 
> <http://im.live.com/Messenger/IM/Join/Default.aspx?source=EML_WL_%20GreaterGood> 
>
> ------------------------------------------------------------------------
>
> --
> http://mail.python.org/mailman/listinfo/python-list




More information about the Python-list mailing list