简体   繁体   中英

how to display a numpy array with pyglet?

I have a label matrix with dimension (100*100), stored as a numpy array, and I would like to display the matrix with pyglet.

My original idea is to use this matrix to form a new pyglet image using function pyglet.image.ImageData(). It requres a buffer of the imagedata as an input, however I have no idea how to get a right formated buffer from the numpy array.

Any one have any idea?

ps. my current solution:

3d_label = numpy.empty([100,100,3])
3d_label[:,:,0] = label * 255            # value range of label is [0,1]
3d_label[:,:,1] = label * 255
3d_label[:,:,2] = label * 255
image_data = ctypes.string_at(id(3d_label.tostring())+20, 100*100*3)
image = pyglet.image.ImageData(100, 100, 'RGB', image_data, -100*3)

Any better way to construct a [100*100*3] matrix from 3 [100*100] matrix with numpy?

I think what you are looking for is np.dstack (or more generally, np.concatenate ):

label255=label*255
label3=numpy.dstack((label255,label255,label255))

This shows dstack produces the same array ( label3 ) as your construction for label_3d :

import numpy as np

label=np.random.random((100,100))
label255=label*255
label3=np.dstack((label255,label255,label255))

label_3d = np.empty([100,100,3])
label_3d[:,:,0] = label * 255            # value range of label is [0,1]
label_3d[:,:,1] = label * 255
label_3d[:,:,2] = label * 255
print(np.all(label3==label_3d))
# True

PS. I'm not sure, but have you tried using label3.data instead of ctypes.string_at(id(label3.tostring())+20, 100*100*3) ?

You can get the memory representation of your array with 3d_label.tostring() .

The tostring() method allows you to change the memory ordering of the elements:

Parameters
----------
order : {'C', 'F', None}, optional
    Order of the data for multidimensional arrays:
    C, Fortran, or the same as for the original array.

PS: The 3d_label.data of ~unutbu requires less memory, since no string is constructed. However, it does not allow you to change the order in which the elements are output.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM