2014-10-21 15 views
5

Dopo l'installazione di Yosemite, ho dovuto aggiornare NumPy, PyOpenGL, eccOpenGL dice "from_param ricevuto una matrice non contiguo"

Ora, un programma precedentemente lavoro mi sta dando la seguente analisi dello stack:

file "latebind.pyx", line 44, in OpenGL_accelerate.latebind.Curry.__call__ (src/latebind.c:1201) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/OpenGL/GL/VERSION/GL_1_5.py", line 89, in glBufferData 
    return baseOperation(target, size, data, usage) 
    File "latebind.pyx", line 32, in OpenGL_accelerate.latebind.LateBind.__call__ (src/latebind.c:989) 
    File "wrapper.pyx", line 314, in OpenGL_accelerate.wrapper.Wrapper.__call__ (src/wrapper.c:6505) 
    File "wrapper.pyx", line 311, in OpenGL_accelerate.wrapper.Wrapper.__call__ (src/wrapper.c:6439) 
ctypes.ArgumentError: ("argument 3: <class 'OpenGL.error.CopyError'>: from_param received a non-contiguous array! []", (GL_ARRAY_BUFFER, 0, array([], 
     dtype=[('time', '<f8'), ('data', [('cluster_index', '<i4'), ('delta_diag_out', '<f8')])]), GL_STREAM_DRAW)) 

Sembra che PyOpenGL desideri che il mio array sia contiguo. Guardando alla fonte in numpy_formathandler.pyx in PyOpenGL:

if not PyArray_ISCARRAY(instance): 
      raise CopyError(
       """from_param received a non-contiguous array! %s"""%(
        working, 
       ) 
      ) 

E PyArray_ISCARRAY (arr) "Valuta vero se l'area dati di arr è in stile C contigui, e PyArray_ISBEHAVED (arr) è vero." Per cui "PyArray_ISBEHAVED (arr) Evalutes true se l'area dati di arr è allineata e scrivibile e in ordine di byte macchina in base al relativo descrittore."

Tuttavia, l'attributo flags della matrice che è stato spinto a OpenGL è:

C_CONTIGUOUS : True 
    F_CONTIGUOUS : True 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : False 
    UPDATEIFCOPY : False 

Forse necessità di allineare la matrice? Ma usare numpy.require con requirements={'ALIGNED': True} non sembra funzionare.

ho guardato i cambiamenti nella NumPy 1.9, che indicano:

C'è una nuova fase di compilazione variabile d'ambiente NPY_RELAXED_STRIDES_CHECKING. Se questa variabile è impostata su 1, numpy considererà più array come C- o F-contigui; ad esempio, è possibile che abbia un vettore di colonna che è considerato sia C- che F-contigui simultaneamente. La nuova definizione è più accurata, consente di ottenere un codice più veloce che produce meno copie non necessarie e semplifica internamente il codice di Numpy. Tuttavia, potrebbe anche interrompere le librerie di terze parti che fanno supposizioni troppo forti sui valori dello stridio degli array C e F contigui. (È inoltre attualmente noto che questo rompe il codice Cython utilizzando memoryviews, che sarà fissato in Cython). Questo diventa predefinita in un comunicato futuro, quindi PREGA testare il codice SUBITO CONTRO NumPy COSTRUITO CON:

NPY_RELAXED_STRIDES_CHECKING = 1 python setup.py install

è possibile verificare se NPY_RELAXED_STRIDES_CHECKING è in effetti eseguendo:

np.ones ((10, 1), order = "C") flags.f_contiguous

.

Vero se il controllo di passi rilassati è abilitato e False altrimenti. Il tipico problema di che abbiamo visto fino ad ora è il codice C che funziona con gli array contigui C e si presuppone che sia possibile accedere alla dimensione dell'articolo guardando l' l'ultimo elemento dell'array PyArray_STRIDES (arr). Quando sono rilassati gli stadi , questo non è vero (e in effetti, non è mai stato vero in alcuni casi d'angolo). Invece, usa PyArray_ITEMSIZE (arr).

Tuttavia, np.ones((10, 1), order="C").flags.f_contiguous è False sul mio sistema. Quindi sono perplesso. Cosa è cambiato che sta facendo sì che opengl pensi che gli array che sto inviando non siano contigui e allineati?C'è un modo per allineare un array con la forza?

risposta

2

Questo è probabilmente legato a questo bug in NumPy 1.9 a cui è assegnato nessuno: https://github.com/numpy/numpy/issues/5224

+1

Grazie per questo, mi hai salvato ore di frustrazione e di un inevitabile 'mi arrendo'. "l'aggiornamento" fino a 1.8.2 ha risolto il problema. – Rebs

+0

Grazie mille! Questo ha funzionato anche per me. @AdamGriffiths Penso che tu possa usare la parola [_downgrading_] (https://en.wikipedia.org/wiki/Downgrade);) –