2013-02-13 12 views
5

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?

risposta

4

Se si chiama il metodo toString, invece, converte l'array di layout di C-contigue:

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

La ragione la stringa è diversa nel tuo caso è a causa della chiamata dstack. Cerca di essere intelligente nello stacking di array combinando semplicemente i dati sottostanti degli array di origine e quindi modificando numpy's stride information. Ciò comporta che l'array non si trova nel layout C-contiguo.

+0

È 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

+0

Sì, credo che .astype mantiene il formato sottostante lo stesso. – jterrace

+1

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

Problemi correlati