On 26.12.2011, at 7:37PM, Fabian Dill wrote:

> I have a problem with a structured numpy array.
> I create is like this:
> tiles = numpy.zeros((header["width"], header["height"],3), dtype =  
> numpy.uint8)
> and later on, assignments such as this:
> tiles[x, y,0] = 3
> 
> Now uint8 is not sufficient anymore, but only for the first of the 3 values.
> uint16 for all of them would use too much ram (increase of 1-3 GB)
> 
> I have tried using structured arrays, but the dtype is essentially always a 
> tuple.
> 
> tiles = numpy.zeros((header["width"], header["height"], 1), dtype =  
> "u2,u1,u1")
> 
> tiles[x, y,0] = 0
> TypeError: expected an object with a buffer interface
> 

If you create a structured array, you probably don't want the third dimension, 
as the 
structure already spans three fields, and to assign to it you either need to 
address 
the fields explicitly (with the default field names 'f0', 'f1', 'f2'), or use 
an array with 
corresponding dtype: 

>>> dt = "u2,u1,u1"
>>> tiles = numpy.zeros((2,3), dtype=dt)
>>> tiles
array([[(0, 0, 0), (0, 0, 0), (0, 0, 0)],
       [(0, 0, 0), (0, 0, 0), (0, 0, 0)]], 
      dtype=[('f0', '<u2'), ('f1', '|u1'), ('f2', '|u1')])

>>> tiles['f0'][0] = 1
>>> tiles[0,1] = np.array((3,4,5), dtype=dt)
>>> tiles
array([[(1, 0, 0), (3, 4, 5), (1, 0, 0)],
       [(0, 0, 0), (0, 0, 0), (0, 0, 0)]], 
      dtype=[('f0', '<u2'), ('f1', '|u1'), ('f2', '|u1')])

Cheers,
                                                                        Derek

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to