Как отобразить массив с Pyglet? - PullRequest
4 голосов
/ 02 июля 2010

У меня есть матрица меток с размером (100 * 100), хранящаяся в виде пустого массива, и я хотел бы отобразить матрицу с pyglet.

Моя оригинальная идея состоит в том, чтобы использовать эту матрицу для формированияновое изображение pyglet с использованием функции pyglet.image.ImageData ().Он требует буфера изображений в качестве входных данных, однако я понятия не имею, как получить правильный форматированный буфер из массива 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)

Есть ли лучший способ построить матрицу [100 * 100 * 3] из матрицы 3 [100 * 100] с numpy?

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

Я думаю, что вы ищете 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 голос
/ 02 июля 2010

Вы можете получить представление памяти вашего массива с помощью 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 требует меньше памяти, поскольку строка не создается. Однако он не позволяет изменить порядок вывода элементов.

...