5

numpyを使用してPythonでBuildOpenGLテクスチャを使用しようとしていますが、numpy配列がメモリ内でどのように編成されるかを予測できないため、問題が発生しています。以下のサンプルプログラム(そのまま実行する必要があります)は、私の混乱を示しています。

from pylab import *

array_by_hand = array(
    [[[1, 2, 3, 4], [1, 2, 3, 4]], 
    [[1, 2, 3, 4], [1, 2, 3, 4]]], dtype='uint8')

layers = 1 * ones((2, 2)), 2 * ones((2, 2)), 3 * ones((2, 2)), 4 * ones((2, 2))
array_from_layers = dstack(layers)
array_from_layers = array_from_layers.astype('uint8')

print array_by_hand; print
print array_from_layers; print

print ' '.join(x.encode('hex') for x in array_by_hand.data)
print ' '.join(x.encode('hex') for x in array_from_layers.data)
print
print all(array_by_hand == array_from_layers)                 # True
print str(array_by_hand.data) == str(array_from_layers.data)  # False

Pythonに関する限り、2つの配列は同等ですが、メモリ内でのレイアウトが異なるため、OpenGLでは表示が異なります。誰かがこれが起こっている理由と、両方のアレイを同じ形式に強制する方法を説明できますか?

4

1 に答える 1

4

代わりにtostringメソッドを呼び出すと、配列がC連続レイアウトに変換されます。

>>> array_by_hand.tostring() == array_from_layers.tostring()
True

あなたの場合、文字列が異なる理由は、dstack呼び出しのためです。ソース配列の基になるデータを組み合わせてから、 numpyのストライド情報を変更するだけで、配列を積み重ねることができます。これにより、アレイはC連続レイアウトになりません。

于 2013-02-13T01:22:21.793 に答える