2010-07-02 7 views
4

J'ai une matrice d'étiquette avec la dimension (100 * 100), stockée comme un tableau numpy, et je voudrais montrer la matrice avec pyglet.comment afficher un tableau numpy avec pyglet?

Mon idée originale est d'utiliser cette matrice pour former une nouvelle image pyglet en utilisant la fonction pyglet.image.ImageData(). Il nécessite une mémoire tampon de l'imagedata comme une entrée, mais je n'ai aucune idée de comment obtenir un tampon correctement formaté à partir du tableau numpy.

Quelqu'un a une idée?

ps. ma solution actuelle:

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) 

une meilleure façon de construire une matrice [100 * 100 * 3] de 3 matrice [100 * 100] avec numpy?

+1

Vous devriez également considérer glumpy pour afficher des tableaux numpy – meduz

Répondre

5

Je pense que ce que vous cherchez est np.dstack (ou plus généralement, np.concatenate):

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

Cela montre dstack produit le même tableau (label3) comme construction 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. Je ne suis pas sûr, mais avez-vous essayé d'utiliser label3.data au lieu de ctypes.string_at(id(label3.tostring())+20, 100*100*3)?

+0

+1 pour '' label3.data'', ce qui est plus efficace que de construire une chaîne. – EOL

+0

label3.data .__ str __() peut remplacer ctypes.string_at (id (label3.tostring()) + 20, 100 * 100 * 3), mais label3.data ne peut pas – zhanwu

1

Vous pouvez obtenir la représentation en mémoire de votre baie avec 3d_label.tostring().

La méthode tostring() vous permet de modifier l'ordre de mémoire des éléments:

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

PS: Le 3d_label.data de ~ unutbu nécessite moins de mémoire, car aucune chaîne est construite. Cependant, cela ne vous permet pas de changer l'ordre dans lequel les éléments sont sortis.

Questions connexes