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?
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
Tak, domyślam się, że .astype zachowuje podstawowy format tak samo. – jterrace
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