python – Cython:使用融合类型在一个参数中传递多个numpy数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Cython:使用融合类型在一个参数中传递多个numpy数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2943字,纯文字阅读大概需要5分钟。
内容图文
![python – Cython:使用融合类型在一个参数中传递多个numpy数组](/upload/InfoBanner/zyjiaocheng/809/019f7a9eb5b641df96ade19e1eb9ee07.jpg)
我已经重写了从C到Cython的算法,所以我可以利用融合类型,并使从python调用更容易.该算法可以使多个数组与其他一些参数一起工作.数组被接受为指针指针(例如).我想我会通过提供多个数组作为numpy数组的元组来从python调用cython代码,但要做到这一点会使融合类型变得混乱.这是我现在如何工作的一个简单示例:
import numpy
cimport numpy
ctypedef fused test_dtype:
numpy.float32_t
numpy.float64_t
cdef int do_stuff(test_dtype **some_arrays):
if test_dtype is numpy.float32_t:
return 1
elif test_dtype is numpy.float64_t:
return 2
else:
return -1
def call_do_stuff(tuple some_arrays):
cdef unsigned int num_items = len(some_arrays)
cdef void **the_pointer = <void **>malloc(num_items * sizeof(void *))
if not the_pointer:
raise MemoryError("Could not allocate memory")
cdef unsigned int i
cdef numpy.ndarray[numpy.float32_t, ndim=2] tmp_arr32
cdef numpy.ndarray[numpy.float64_t, ndim=2] tmp_arr64
if some_arrays[0].dtype == numpy.float32:
for i in range(num_items):
tmp_arr32 = some_arrays[i]
the_pointer[i] = &tmp_arr32[0, 0]
return do_stuff(<numpy.float32_t **>the_pointer)
elif some_arrays[0].dtype == numpy.float64:
for i in range(num_items):
tmp_arr64 = some_arrays[i]
the_pointer[i] = &tmp_arr64[0, 0]
return do_stuff(<numpy.float64_t **>cols_pointer)
else:
raise ValueError("Array data type is unknown")
我意识到我可以在元组中指定类型,但如果我理解正确的话,没有比“对象”更复杂的东西.有谁知道我正在做的事情更清洁的方式?任何其他cython技巧表示赞赏.
传递了其他参数,包括与数组相同类型的fill_value参数.如果test_dtype可以在调用时通过数组或fill参数确定,代码会变得更简单,但我找不到一个好的方法来保证C将以正确的类型接收值.例如,传递numpy.nan或numpy.float64(numpy.nan)并不保证数据类型.
解决方法:
在Python和NumPy编程10年之后(以及C之前的C,C,Matlab和Fortran),这是我的总体印象:
在C,C或Fortran中编写数字代码通常比Cython更容易.我能想到的唯一例外是最小的代码snipplet.在C中,您可以使用模板和STL(如果您愿意,还可以使用Boost).
学习使用NumPy C API. PyArrayObject(在C中调用NumPy数组)具有可用于调度的类型编号.您可以使用PyArrayObject *上的宏PyArray_TYPE()获取它. numpy.float64映射到类型号NPY_FLOAT64,numpy.float32映射到类型号NPY_FLOAT32等.然后你有相应的C和C typedef,你可以在你的C或C代码中使用:如果PyArray_TYPE(x)== NPY_FLOAT64,数据要在C或C中使用的类型是npy_float64.这样您就可以编写C或C代码,这些代码完全由您传入的NumPy数组定义.
我通常在PyArray_TYPE(x)上使用switch语句,在NPY_FLOAT64,NPY_FLOAT32等上使用case.对于每种情况,我都使用正确的模板类型调用模板化C函数.这样可以将我需要写入的代码量保持在最低限度.
http://docs.scipy.org/doc/numpy/reference/c-api.html
Cython适用于包装C和C并避免繁琐的Python C API编码,但这是对静态类型参数的限制.对于“从头到尾”的数字代码,我认为使用普通的C更好,但Cython是一个很好的工具,可以将它暴露给Python.所以在C中编写你的数字内容并使用Cython来调用你的C.这将是我能给出的最好的建议.Cython是一个很好的工具,用于编写Python的C扩展,但当C是你真正想要的时候,它不能代替C.
至于你的问题:你想做的事情真的不可能.因为在C或C中,这是Cython发出的,numpy.ndarray是PyArrayObject *,无论dtype如何.所以你需要手动编写switch语句.
内容总结
以上是互联网集市为您收集整理的python – Cython:使用融合类型在一个参数中传递多个numpy数组全部内容,希望文章能够帮你解决python – Cython:使用融合类型在一个参数中传递多个numpy数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。