我通过向一些变量添加类型,将python函数转换为cython等效函数。但是,cython函数生成的输出与原始python函数略有不同。在

我在这篇文章中了解了造成这种差异的一些原因

Cython: unsigned int indices for numpy arrays gives different result

但是即使我在这篇文章中了解到的,我仍然不能让cython函数产生与python函数相同的结果。在

所以我把4个函数放在一起说明我所做的。有人能帮我解释一下为什么每个函数的结果略有不同?如何得到一个cython函数,它返回与function1相同的值?我在下面发表一些评论:%%cython

import numpy as np

cimport numpy as np

def function1(response, max_loc):

x, y = int(max_loc[0]), int(max_loc[1])

tmp1 = (response[y,x+1] - response[y,x-1]) / 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))

tmp2 = (response[y,x+1] - response[y,x-1])

tmp3 = 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))

print tmp1, tmp2, tmp3

return tmp1, tmp2, tmp3

cpdef function2(np.ndarray[np.float32_t, ndim=2] response, np.ndarray[np.float64_t, ndim=1] max_loc):

cdef unsigned int x, y

x, y = int(max_loc[0]), int(max_loc[1])

tmp1 = (response[y,x+1] - response[y,x-1]) / 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))

tmp2 = (response[y,x+1] - response[y,x-1])

tmp3 = 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))

print tmp1, tmp2, tmp3

return tmp1, tmp2, tmp3

cpdef function3(np.ndarray[np.float32_t, ndim=2] response, np.ndarray[np.float64_t, ndim=1] max_loc):

cdef unsigned int x, y

x, y = int(max_loc[0]), int(max_loc[1])

cdef np.float32_t tmp1, tmp2, tmp3

cdef np.float32_t r1 =response[y,x+1]

cdef np.float32_t r2 =response[y,x-1]

cdef np.float32_t r3 =response[y,x]

cdef np.float32_t r4 =response[y,x-1]

cdef np.float32_t r5 =response[y,x+1]

tmp1 = (r1 - r2) / 2*(r3 - min(r4, r5))

tmp2 = (r1 - r2)

tmp3 = 2*(r3 - min(r4, r5))

print tmp1, tmp2, tmp3

return tmp1, tmp2, tmp3

def function4(response, max_loc):

x, y = int(max_loc[0]), int(max_loc[1])

tmp1 = (float(response[y,x+1]) - response[y,x-1]) / 2*(float(response[y,x]) - min(response[y,x-1], response[y,x+1]))

tmp2 = (float(response[y,x+1]) - response[y,x-1])

tmp3 = 2*(float(response[y,x]) - min(response[y,x-1], response[y,x+1]))

print tmp1, tmp2, tmp3

return tmp1, tmp2, tmp3

max_loc = np.asarray([ 15., 25.], dtype=np.float64)

response = np.zeros((49,49), dtype=np.float32)

x, y = int(max_loc[0]), int(max_loc[1])

response[y,x] = 0.959878861904

response[y,x-1] = 0.438348740339

response[y,x+1] = 0.753262758255

result1 = function1(response, max_loc)

result2 = function2(response, max_loc)

result3 = function3(response, max_loc)

result4 = function4(response, max_loc)

print result1

print result2

print result3

print result4

结果是:

^{pr2}$

function1表示我在原始python函数中所做的操作。tmp1是结果。在

function2是我的第一个cython版本,它产生的结果略有不同。显然,如果使用类型化变量unsigned int或int为响应数组编制索引,则结果将强制为double(使用PyFloat_FromDouble),即使数组的类型是np.float32但是如果数组是用python int索引的,则使用函数PyObject_GetItem,我得到np.float32, 函数1就是这样。所以函数1中的表达式是用np.float32操作数,而函数2中的表达式是使用双精度运算的。

我得到的打印结果与函数1中的略有不同。在

function3是我第二次尝试获得与function1相同的输出。这里我使用unsigned int索引来访问数组响应,但是结果是保留的np.float32然后我在计算中使用的中间变量。我得到的结果略有不同。显然print语句将使用PyFloat_FromDouble,因此无法打印np.float32一

然后我试图更改python函数以匹配cython函数。函数4试图通过将每个表达式中的至少一个操作数转换为float来实现这一点,因此其他操作数也被强制转换为python float,这在cython中是一个double,并且表达式是用double计算的,如function2所示。函数内部的打印与function2完全相同,但返回的值略有不同?!在

python中out函数_cython函数输出与python函数outpu略有不同相关推荐

  1. Python中lambda详解(包括内置函数map、reduce、filter、sorted、max)

    文章目录 一.lambda是什么? 1.lambda语法 2.语法详解 二.lambda的使用 1.定义 2.调用 3.替换 4.作返回值 三.lambda作参数 1.map函数 2.reduce函数 ...

  2. Python中pandas库实现数据缺失值判断isnull()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中pandas库实现数据缺失值判断 isnull()函数 ...

  3. python中标识符下划线用作开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  4. Python中通过索引名称提取数据loc()函数Python中通过行和列下标提取数据iloc()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中通过索引名称提取数据 loc()函数 Python中通过 ...

  5. python中那些双下划线开头的那些函数都是干啥用用的

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  6. python属性名以两个下划线开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  7. 深入理解Python中的字符编码、文件处理和函数

    博客核心内容: 1.Python基础之字符编码的介绍 2.Python中文件处理的介绍 3.Python中函数的介绍 4. File.readlines(sizehint) 函数 一.Python基础 ...

  8. python输入输出-2. Python中的基本输入、输出、格式化输出

    本文利用的是Python 3.x版本,建议学习3.x版本 Python中的基本输入.输出.格式化输出 1. 输入 使用input([prompt])读取一行,将其转换为string类型并返回,inpu ...

  9. python中日期和时间格式化输出的方法

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 import time timeArray = time.strp ...

  10. [转载] python中日期和时间格式化输出的方法

    参考链接: Python程序将时间从12小时转换为24小时格式 1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 i ...

最新文章

  1. 例题3-4 猜数字游戏的提示(Master-Mind Hints, UVa 340)
  2. AIDL注意细节 简单Demo
  3. Springboot线程池的使用和扩展
  4. java.sql.SQLException: ORA-01438: 值大于此列指定的允许精确度
  5. linux tar 打包.压缩.解压缩 命令说明
  6. [转载] 信息系统项目管理师教程——06 信息化基础知识
  7. linux shell读取文件,shell脚本中读取文件的方法
  8. 我的春招实习+秋招总结【前端开发】
  9. Python之模块pandas基础知识
  10. MIPI入门——D-PHY介绍(一)
  11. 7-1 sdust-Java-字符串集合求并集 (20 分)
  12. python 数据清洗 豆瓣电影_利用python进行数据清洗和分析
  13. 学习编程该如何记笔记(摘自简书、博客)
  14. 市面上有几款手机有NFC功能的,什么牌子什么型号的?
  15. xxl-job任务详解
  16. html语音输入功能讯飞,win10系统利用讯飞语音输入法实现电脑语音输入的方案介绍...
  17. ElementUI轮播图指示器设置为图片
  18. 时代的榜样---女生要做到的8荣8耻
  19. 2023年自动化测试真有那么重要吗?内卷严重,测试技能水涨船高......
  20. 常用的解决网络出现黄叉的方法

热门文章

  1. Hadoop数据读写原理
  2. kafka单机环境搭建
  3. salt-API基本验证命令
  4. 蓝讯数卡api接口,可以接通25家话费充值卡、游戏点卡官方通道,轻松完成客户快速消耗...
  5. ATL之深入浅出书评(转)
  6. 【连载】【FPGA黑金开发板】NIOS II那些事儿--SDRAM实验(十二)
  7. C# 值类型和引用类型 以及作为方法参数的区别
  8. 水晶报表的使用经验和资料总结
  9. [AutoSar]RTE运行逻辑、通信逻辑与接口实现
  10. 【TDA4系列】 IPC applications应用举例