Cython:初始化结构化Numpy数组ValueError

时间:2015-09-28 14:44:12

标签: python arrays numpy cython

我想使用Cython来加速我的Python代码,类似于Cython's Numpy tutorial。我给你一个我想要的MWE:

测试功能:

import pyximport
pyximport.install()
import CythonModule2 as cm2

print cm2.read_data()

Cython模块CythonModule2.pyx

from libc.stdio cimport *
import numpy as np
cimport numpy as np

cdef packed struct CData:
    np.float32_t A
    np.uint8_t CH1, CH2
    np.int64_t D

def read_data():
    cdef np.ndarray[CData] coins = np.empty(10, dtype=[('A', 'f4'),
                                                       ('CH1', '|u1'), ('CH2', '|u1'),
                                                       ('D', '<i8')])
    return coins;

函数read_data()中的定义产生以下错误消息(并且C ++“以不寻常的方式终止”):

  

ValueError:缓冲区dtype不匹配;下一个字段位于偏移6但预期为8

我可以格式化64位(8字节)变量中的所有条目,但我希望保持数据尽可能小,以节省空间。

顺便说一下:我的电脑设置如下:

  • Windows 7 64位
  • 32位Python(x,y)2.7.6
  • MinGW的编译器mingw32-gcc-4.8.1
  • Cython版本0.23.2
  • Numpy版本1.10.0

我认为这与前一个问题中的错误不同,因为我更新了Cython:Passing a structured numpy array with strings to a cython function

修改

通过使用distutils编译模块,显示相同的错误。执行该功能时,会发生上述错误。

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('CythonModule2.pyx'))
import CythonModule2 as cm2
print cm2.read_data()

编辑2:输出文件

没有名为CythonModule2.pyd的文件。创建的文件(CythonModule2.cCythonModule2.defCythonModule2.o)存储在以下位置:

  

C:\用户\ Myself.pyxbld \ temp.win32-2.7 \推出\派热克斯\

1 个答案:

答案 0 :(得分:0)

  海湾合作委员会:5.2

     

Cython:0.23.2

     

Python:2.7.10

     

Numpy:1.9.2

     

操作系统:Linux

我的环境一切正常。运行脚本的结果:

[(1.5573903757535362e+29, 155, 127, 9195066190654341120)
 (7.709522375552512e+37, 229, 106, 7556991212100550555)
 (4.57762169340988e-41, 176, 211, 9056738852782958815)
 (nan, 0, 0, 140305456158120)
 (8.456264184549564e+24, 155, 127, 9195058375810875392)
 (-98784247808.0, 223, 104, 753066985721462683)
 (0.04620097950100899, 65, 0, 7696651763176177664)
 (38982272417792.0, 0, 0, 140305575418824)
 (0.04620097950100899, 61, 61, 4412750543122677053)