Sto provando a usare le trame OpenGL di compilazione in python usando numpy, ma sto avendo dei problemi perché non riesco a prevedere come saranno organizzati gli array numpy in memoria. Il programma esempio che segue (che dovrebbe funzionare così com'è) illustra mia confusione:Capire come sono disposti in memoria gli array 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
Sebbene le due matrici sono equivalenti per quanto pitone è interessato, la sono disposte in modo diverso in memoria e quindi visualizzati in modo diverso da OpenGL. Qualcuno può spiegare perché questo sta accadendo e come potrei costringere entrambi gli array allo stesso formato?
È stata una sorpresa per me che, durante la copia dei dati nel passaggio '.astype ('uint8')', la copia non fosse riorganizzata in forma contigua a C. – Jaime
Sì, credo che .astype mantiene il formato sottostante lo stesso. – jterrace
Puoi anche usare 'np.ascontiguousarray' per assicurarti il layout di memoria che vuoi ... anche' .flatten() 'copierà sempre il tuo array, anche se non è necessario. E in realtà '.tostring()' garantisce già l'output contiguo di 'C'. – seberg