4

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

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

有人知道吗?

附言。我目前的解决方案:

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)

用numpy从3个[100*100]矩阵构造一个[100*100*3]矩阵的更好方法吗?

4

2 回答 2

5

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

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

这显示生成与您的构造dstack相同的数组 ( ) :label3label_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)

于 2010-07-02T13:01:08.237 回答
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:3d_label.data~unutbu 需要更少的内存,因为没有构造字符串。但是,它不允许您更改元素的输出顺序。

于 2010-07-02T13:53:01.247 回答