我有一个尺寸为(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]矩阵的更好方法是什么?
答案 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
需要更少的内存,因为没有构造字符串。但是,它不允许您更改元素的输出顺序。