如何使用pyglet显示numpy数组?

时间:2010-07-02 11:51:11

标签: python numpy pyglet

我有一个尺寸为(100 * 100)的标签矩阵,存储为numpy数组,我想用pyglet显示矩阵。

我最初的想法是使用此矩阵使用函数pyglet.image.ImageData()形成一个新的pyglet图像。它需要将imagedata的缓冲区作为输入,但我不知道如何从numpy数组中获取正确的格式化缓冲区。

任何人都有任何想法?

PS。我目前的解决方案:

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)

从n [3 * 100 * 100]矩阵构造[100 * 100 * 3]矩阵的更好方法是什么?

2 个答案:

答案 0 :(得分:5)

我认为您要找的是np.dstack(或更一般地说,np.concatenate):

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

这显示dstack生成与label3的构造相同的数组(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。我不确定,但您是否尝试过使用label3.data代替ctypes.string_at(id(label3.tostring())+20, 100*100*3)

答案 1 :(得分:1)

您可以使用3d_label.tostring()获取数组的内存表示。

tostring()方法允许您更改元素的内存排序:

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

PS:~unutbu的3d_label.data需要更少的内存,因为没有构造字符串。但是,它不允许您更改元素的输出顺序。