繁体   English   中英

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

[英]Cython: Initialize Structured Numpy Array ValueError

我想使用Cython来加速我的Python代码,类似于Cython的Numpy教程 我给你一个我想要的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: 将带有字符串的结构化numpy数组传递给cython函数

编辑

通过使用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:\\ Users \\用户Myself.pyxbld \\ temp.win32-2.7 \\发布\\耐热玻璃\\

海湾合作委员会: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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM