【问题标题】:Cython: Initialize Structured Numpy Array ValueErrorCython:初始化结构化 Numpy 数组 ValueError
【发布时间】:2015-12-25 20:40:34
【问题描述】:

我想使用 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:缓冲区数据类型不匹配;下一个字段的偏移量为 6,但预期为 8

我可以将所有条目格式化为 64 位(八字节)变量,但我希望数据尽可能小以节省空间。

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

  • 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:\Users\Myself.pyxbld\temp.win32-2.7\Release\pyrex\

【问题讨论】:

  • u1 是 unicode,即 3 或 4 个字节。
  • 所以这意味着我应该用CH1CH2 重写这一行?如果我从CData 和定义中删除它们,问题仍然存在。您对floatint 有其他想法吗?
  • 我将 Numpy 更新到 1.10.0 版,但问题没有解决。
  • 抱歉,我把u1 误认为U1。这是您所期望的uint8

标签: python arrays numpy cython


【解决方案1】:

GCC:5.2

赛通: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)

【讨论】:

  • 我仍在使用 Numpy 版本 1.9.1 和 gcc 4.8.1(这是 Windows 的最新版本)。可能是我的 MinGW 配置有问题。
  • 你能粘贴你生成的 CythonModule2.c 文件吗?我想和我的比较一下。
  • 我将生成的文件CythonModule2.c 上传到pastebin.com/aZmGURMs,以便您检查您的版本。
  • 文件非常相似。我也编译你的 *.c 文件没有任何问题。这只是一个猜测,但如果你安装64位python版本呢?
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多