Nei*_*l G 5 python opengl numpy pyopengl
安装Yosemite后,我不得不升级numpy,PyOpenGL等.
现在,一个以前工作的程序给了我以下堆栈跟踪:
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))
Run Code Online (Sandbox Code Playgroud)
看起来PyOpenGL希望我的数组是连续的.在PyOpenGL中查看numpy_formathandler.pyx中的源代码:
if not PyArray_ISCARRAY( instance ):
raise CopyError(
"""from_param received a non-contiguous array! %s"""%(
working,
)
)
Run Code Online (Sandbox Code Playgroud)
并且PyArray_ISCARRAY(arr)"如果arr的数据区域是C风格连续的,并且PyArray_ISBEHAVED(arr)为真,则求值为true." 因此,"PyArray_ISBEHAVED(arr)如果arr的数据区域是对齐且可写的,则根据其描述符以机器字节顺序进行评估."
但是,flags
推送到OpenGL的数组的属性是:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : False
UPDATEIFCOPY : False
Run Code Online (Sandbox Code Playgroud)
也许我需要对齐阵列?但使用numpy.require
与requirements={'ALIGNED': True}
似乎不起作用.
我看了numpy 1.9中的变化,这表明:
有一个新的编译时环境变量NPY_RELAXED_STRIDES_CHECKING.如果此变量设置为1,则numpy将考虑更多数组为C或F连续 - 例如,可以使列向量同时被视为C连续和F连续.新定义更准确,允许更快的代码,减少不必要的副本,并在内部简化numpy的代码.但是,它也可能会破坏第三方库,这些库对C和F连续数组的步幅值做出过于强烈的假设.(目前还知道这会使用内存视图中断Cython代码,这将在Cython中修复.)这将成为未来发布的默认值,因此请检查您的代码以防止在以下情况下执行:
NPY_RELAXED_STRIDES_CHECKING = 1个python setup.py安装
您可以通过运行来检查NPY_RELAXED_STRIDES_CHECKING是否生效:
np.ones((10,1),order ="C").flags.f_contiguous
如果启用了轻松的步幅检查,则为True,否则为False.到目前为止我们看到的典型问题是C代码与C连续数组一起工作,并假设可以通过查看PyArray_STRIDES(arr)数组中的最后一个元素来访问itemsize.当轻松的步幅生效时,这是不正确的(实际上,在某些角落情况下它从来都不是这样).相反,使用PyArray_ITEMSIZE(arr).
但是,np.ones((10, 1), order="C").flags.f_contiguous
我的系统是假的.所以我很难过.改变了什么导致opengl认为我发送的数组不是连续的和对齐的?有没有办法用力对齐阵列?
归档时间: |
|
查看次数: |
237 次 |
最近记录: |