4

numpy 配列として格納された次元 (100*100) のラベル マトリックスがあり、pyglet でマトリックスを表示したいと思います。

私の最初のアイデアは、この行列を使用して、関数 pyglet.image.ImageData() を使用して新しい pyglet 画像を形成することです。入力として画像データのバッファが必要ですが、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)

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と同じ配列 ( 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)か?

于 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 に答える