python mount回调函数_为python回调函数设置argtype

我对Python很在行,所以希望我能正确地表达这个问题。在

整个问题涉及从Python调用C例程。我可以通过把一些相关的问题/答案凑在一起来接近,但我似乎不能把事情安排得很好。有两个方面:第一个是用指针调用C例程,第二个是使用回调函数。在

背景

Rubner提供了一个用C[EMD C code location]编写的EMD例程,他还提供了两个调用EMD例程的示例C程序。我正在尝试开发一个Python例程,作为example2.c的替代,它将调用EMD例程。(是的,我熟悉EMD的OpenCV实现。)

为了方便起见,下面是我想从python调用的emd.c代码的头文件:/* DEFINITIONS */

#define MAX_SIG_SIZE 100

#define MAX_ITERATIONS 500

#define INFINITY 1e20

#define EPSILON 1e-6

/*****************************************************************************/

/* feature_t SHOULD BE MODIFIED BY THE USER TO REFLECT THE FEATURE TYPE */

typedef int feature_t;

/* typedef struct { int X,Y,Z; } feature_t;*/

/*typedef struct { int X; } feature_t; */

/*****************************************************************************/

typedef struct

{

int n; /* Number of features in the signature */

feature_t *Features; /* Pointer to the features vector */

float *Weights; /* Pointer to the weights of the features */

} signature_t;

typedef struct

{

int from; /* Feature number in signature 1 */

int to; /* Feature number in signature 2 */

float amount; /* Amount of flow from "from" to "to" */

} flow_t;

float emd(signature_t *Signature1, signature_t *Signature2,

float (*func)(feature_t *, feature_t *),

flow_t *Flow, int *FlowSize);

#endif

最后,这里是我迄今为止拼凑起来的python代码。我认为(但不确定)我已经正确地设置了结构。(请注意,这是Rubner emd.c代码中可能的功能结构的简化版本。我最终想让整个工作正常,但现在我开始变得简单了。)我遇到的第一个问题是调用函数的argtypes中的某个地方。我尝试过一些变体,但是在网上可以找到的例子非常少,我遇到了困难。在

^{pr2}$

如果有任何关于我哪里出错的建议,我们将不胜感激。在

我肯定会遇到的第二个问题是返回指针的argtypes;这里的任何建议都将受到欢迎。在

提前谢谢。在

------------更新(工作)代码import ctypes

import math

import itertools

MAX_FEATURE_SIZE = 25

FEATURE_t = ctypes.c_int

FEATURE_ptr = ctypes.POINTER(FEATURE_t)

WEIGHT_t = ctypes.c_float

WEIGHT_ptr = ctypes.POINTER(WEIGHT_t)

COUNT_t = ctypes.c_int

COUNT_ptr = ctypes.POINTER(COUNT_t)

class FLOW_t(ctypes.Structure):

_fields_ = [("frm", ctypes.c_int),

("to", ctypes.c_int),

("amount", ctypes.c_float)]

# Note that ctypes.POINTER is compatible with a ctypes array declared

# as TYPE * array_len. This is equivalent to the way we can say 'char

# *foo = "ABCDEF"' in C.

class SIGNATURE_t(ctypes.Structure):

_fields_ = [("N", COUNT_t ),

("feature", FEATURE_ptr),

("weight", WEIGHT_ptr)]

FLOW_ARRAY_t = FLOW_t * (2*MAX_FEATURE_SIZE - 1)

CMPFUNC_t = ctypes.CFUNCTYPE(ctypes.c_float, FEATURE_ptr, FEATURE_ptr)

SIGNATURE_ptr = ctypes.POINTER(SIGNATURE_t)

FLOW_ptr = ctypes.POINTER(FLOW_t)

# Convenience function - keeps us from having to remember all the types and parameters later on

def make_signature(features, weights):

sig = SIGNATURE_t()

sig.N = len(features)

sig.feature = (len(features) * FEATURE_t)(*features)

sig.weight = (len(weights) * WEIGHT_t)(*weights)

return sig

# We want to pass into C a custom distance function from Python

def py_dist_func(f1,f2):

# print "f1, f2: %d, %d" % ( f1[0], f2[0] )

d= distance(f1[0],f2[0])

return d

# set this up as a holder for distance function between any two n-D points

def distance(p0,p1):

return(math.fabs(p0-p1))

dist_callback = CMPFUNC_t(py_dist_func)

#print "Importing emdlib"

emdlib = ctypes.CDLL('emdlib.dylib')

#print "Setting argtypes"

emdlib.emd.argtypes = [ SIGNATURE_ptr,

SIGNATURE_ptr,

CMPFUNC_t,

FLOW_ptr,

COUNT_ptr ]

#print "Setting restype"

emdlib.emd.restype = ctypes.c_float

feature1 = [0, 1,2,3,4,5,6,7,8]

feature2 = [0, 1,2,3,4,5,6,7,8]

weight1 = [0.275,0.296,0.002,0.131,0.208,0.048,0.058,0.098,0.455]

weight2 = [0.285,0.421,0.028,0.021,0.240,0.166,0.023,0.054,0.469]

#print "Creating signatures"

signature1 = make_signature(feature1, weight1)

signature2 = make_signature(feature2, weight2)

flow_array = FLOW_ARRAY_t()

flow_size = COUNT_t()

#print "Calling EMD"

e = emdlib.emd(ctypes.byref(signature1),

ctypes.byref(signature2),

dist_callback,

flow_array,

ctypes.byref(flow_size))

print "EMD= ", e

print "Number of FlowS", flow_size.value

print "Flow"

print "from to amount"

totalFlow=0.0

for i in range(0,flow_size.value):

# print "Flow from %d to %d amount :%f" %(flow_array[i].frm, flow_array[i].to, flow_array[i].amount)

print " %d %d %f" %(flow_array[i].frm, flow_array[i].to, flow_array[i].amount)

totalFlow=totalFlow+flow_array[i].amount

#

# now adjust EMD to account for different signature masses and make it a metric

alpha=1.0

mass1=sum(weight1)

mass2=sum(weight2)

fList=[feature1,feature2]

max_distance= 0.0

for p0, p1 in list(itertools.product(*fList)):

# print p0,p1, distance(p0,p1), max_distance

max_distance = max(max_distance, distance(p0, p1))

print "\nMax distance= %f" % max_distance

print "Total Source = %f" % mass1

print "Total Demand = %f" % mass2

print "Total Flow= %f\n " % totalFlow

print "Alpha = %f\n" %alpha

# emdHat = e*totalFlow+math.sqrt((mass1-mass2)*(mass1-mass2))*alpha*max_distance

emdHat = e*totalFlow+math.fabs((mass1-mass2))*alpha*max_distance

print "Corrected Earth Movers Distance \n"

print "emdHat = %f\n" % emdHat;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

参考 备份

原链接http://help.jd.com/Vender/question-1004.html 京东开放平台招商基础资质标准 一、基础资质标准: 注:商家可以选择京东质检平台中的第三方机构检测服务,申请地址:http://fw.jd.com/ser/list.action?page1&cid400 店铺…

android透明像素效率,android-非透明像素上的ImageView ColorFilter.夹

我有一个带位图的ImageView.该位图具有Alpha通道和透明像素.当我尝试将ColorFiter与Mode.OVERLAY(由于蜂窝)一起使用时-提供的颜色覆盖了整个imageview(整个矩形),但是我只想覆盖非透明像素.我如何裁剪imageview的画布以在需要的地方执行过滤器?更新我在png中有灰色…

svm预测结果为同一个值_SVM算法总结

一、1.感知机模型:感知器模型是SVM、神经网络、深度学习等算法的基础;感知器模型就是试图找到一条直线,能够把所有的“1”类和“-1”类分隔开,如果是高维空间中,感知器模型寻找的就是一个超平面,能够把所有的二元类别分…

iOS 动画绘制线条颜色渐变的折线图

效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图。折线图可以更加直观的表示数据的变化。网络上有很多绘制折线图的demo,有的也使用了动画,但是线条颜色渐变的折线图的…

python股票交易模型_如何用Python建模GGM模型并对股票估值?

内容首发乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech用代码理解分析解决金融问题首先我们快速了解一下什么是GGM模型。GGM模型又叫做“戈登增长模型”(Gordon Growth Model,GGM)是用于对公司进行估值的工具。该理论假设公司的内在价值就是将所有…

android android 修改 jpg exif 属性,Android开发之使用ExifInterface获取拍照后的图片属性...

本文实例讲述了Android开发之使用ExifInterface获取拍照后的图片属性。分享给大家供大家参考,具体如下:ExifInterface exif new ExifInterface(file.getPath());String widthStr exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);String heightStr …

[Selenium] 最大化或自定义浏览器的大小

driver.manage().window().maximize(); //将浏览器设置为最大化的状态driver.manage().window().setSize(new Dimension(600, 400)); //将浏览器的大小自定义为600*400转载于:https://www.cnblogs.com/MasterMonkInTemple/p/5212721.html

python中如何替换某列特定数值_python 怎么根据两列值,修改对应的某列值,其中一列的为需要修改的列标题...

自己造了些数据,不知道是否符合题主的意思。原始数据:no wrong_item0 001 a1 003 a2 002 b3 004 c处理后结果:Out[1]:no a b c0 001 1 0 02 002 0 1 01 003 1 0 03 004 0 0 1具体代码如下:import pandas as pd# 创建dataframe,或者…

android怎么ota升级,Android OTA升级过程

通过网络或直接本地获取到OTA升级包之后,通过程序就可开始Android的升级。本文描述这一过程。在获取到OTA升级包之后,可以直接通过android.os.RecoverySystem.installPackage()开启OTA升级。RecoverySystem.installPackage()是在API-8之后加入的&#xf…

进阶学习js中的执行上下文

在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文。 1、当遇到变量名和函数名相同的问题。 var a 10; function a(){console.log(1); } a(); //报错 如果你觉得函数a会覆盖变量a那你…

android使碎片切换界面,玩转Android中的碎片Fragment

引言:在Android开发中,我们都知道一些界面的展示经常会用到的就是Activity,但是Activity存在着很大的局限性,比如说手机上的界面显示在平板上面就会发生各种变形的问题,Activity也无法实现局部的数据刷新,所以Android3.0之后出来了Fragment,Fragment通常…

python123阶乘累加_使用多线程计算阶乘累加 1!+2!+3!+...+19!+20!。其中一个线程计算阶乘,另一线程实现累加并输出结果。...

运用多线程的信号灯法进行边加边计算!代码如下public class JieChen {public static void main(String args[]){Sum sum new Sum();new Play(sum).start();new Add(sum).start();}}class Play extends Thread{Sum sum;public Play(Sum sum){this.sumsum;}Overridep…

html GPS坐标实现,JavaScript 实现GPS坐标点距离计算(两个经/纬度间的距离计算)...

在LBS(基于位置服务)的一些应用中,有时我们会需要计算两个用户或两个坐标点之间的距离。要解决这类问题,就要了解空间几何的概念并结合数学中在三角函数公式计算两点之间的值。本文介绍基于经度/纬度的,两个坐标点之间的距离计算,…

机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线

本篇文章转载自博客园,作者: 刘建平Pinard在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使…

html全局浮窗,Html 实现浮动窗口

今天在写一个html代码时,需要用到浮动窗口,通知信息,网站找了一下,代码如下带关闭按钮的浮动窗口代码(全屏漂浮)#fdck {border:1px solid #c0c0c0;margin:0 auto;padding:5px;background:#f0f0f0}关闭欢迎来到营了个销&#xff01…

python数据可视化工具 pandas_Pandas数据可视化工具——Seaborn用法整理(下)

在前一篇文章 Pandas数据可视化工具——Seaborn用法整理(上),我们了解了如何使用这些Seaborn代码绘制分布图和分类图。在本文中,我们将继续讨论Seaborn提供的一些其他以绘制不同类型统计图的功能,我们将从矩阵图开始讨论。矩阵图矩阵图是一种…

ssm框架里面前端拿HTML写,ssm框架引入Vue,声明式渲染,标签的href拼接字符串

一、引入Vue在官网上下载vue.js。并用1.下载Vue.js,地址:Vue.js下载地址二、通过ajax获取后台参数,使用Vue渲染调用后台control,获取到数据,传到前端,使用Vue进行渲染。//详细分类,使用Vue渲染function fin…

html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作

MutationObserver介绍MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件.Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时,Mutation …

Maven(五)使用Nexus搭建Maven私服

文章装载于:http://blog.csdn.net/jun55xiu/article/details/39497089 Nexus介绍 Nexus是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库下载所需要的构件(artifact),但这通常不是一个好的做法&am…

python mean dropna_小丸子踏入python之路:python_day05(用Pandas处理泰坦尼克船员获救数据titanic_train.csv)...

泰坦尼克船员获救数据:titanic_train.csv用excel打开数据集。显示如下:写在前边:为了方便以后运用numpy和pandas的库,分别造它们的别名np和pd.import pandas as pd #造pandas的别名为pdimport numpy as np #造numpy的别名为np一、…