2013-02-13 11 views
5

Próbuję użyć kompilacji tekstur OpenGL w pythonie za pomocą numpy, ale mam problemy, ponieważ nie mogę przewidzieć, jak uporządkowane będą tablice numpy. Przykładowy program poniżej (który powinien działać jak jest) ilustruje moje zamieszanie:Zrozumienie, jak tablice numpy są rozmieszczone w pamięci

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 

Chociaż obie tablice są równoważne miarę python to dotyczy, są określone inaczej w pamięci i dlatego wyświetlany w różny sposób przez OpenGL. Czy ktoś może wyjaśnić, dlaczego tak się dzieje i jak zmusić obie tablice do tego samego formatu?

Odpowiedz

4

Jeśli wywołać metodę toString zamiast tego zamienia tablicę układ C-Sąsiadujące:

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

Powodem ciąg jest inna w Twoim przypadku, to ze względu na wezwanie dstack. Stara się być inteligentnym w układaniu tablic razem, po prostu łącząc podstawowe dane z macierzy źródłowych, a następnie zmieniając numpy's stride information. Powoduje to, że tablica nie jest w układzie przylegającym do C.

+0

To było dla mnie niespodzianką, że podczas kopiowania danych w kroku '.astype (" uint8 ")' kopia nie została uporządkowana do postaci przylegającej do C. – Jaime

+0

Tak, domyślam się, że .astype zachowuje podstawowy format tak samo. – jterrace

+1

Można również użyć 'np.ascontiguousarray', aby zapewnić pożądany układ pamięci ... również' .flatten() 'zawsze skopiuje twoją tablicę, nawet jeśli nie musi. I rzeczywiście '.tostring()' zapewnia już ciągłe wyjście 'C'. – seberg

Powiązane problemy