天道酬勤,学无止境

在 Python 中以向量作为参数导入 C++ 函数(Importing C++ function with vectors as arguments in Python)

问题

我正在尝试在 Python 中导入 C++ 函数。 我知道已经有一些关于这个的帖子。 但是,我还没有找到任何关于将向量作为参数的函数。 我的 C++ 函数是这样的:

double many_body_pot(
    std::vector< std::vector<double> > &par,
    std::vector< std::vector<double> > &geometry,
    double x, double y, double z
)
{
    // ...
}

如您所见,它需要 2 个向量和 3 个双精度数作为参数,并返回双精度数作为结果。 我还阅读了这篇关于用 C++ 扩展 Python 的文章。

但我仍然完全迷失了,我唯一清楚的是我必须在我的 C++ 代码中包含:

#include <Python.h>

所以我想在 Python 中导入这个函数,并使用列表或数组作为 C++ 向量的参数。 如何才能做到这一点?

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 将 C++ std::Vector 传递给 Python 中的 numpy 数组(Passing a C++ std::Vector to numpy array in Python)
    问题 我正在尝试将我在C++代码中生成的双精度向量传递给python numpy 数组。 我希望在Python进行一些下游处理,并希望在填充 numpy 数组后使用一些 Python 工具。 我想做的最重要的事情之一就是能够绘制事物,而 C++ 在这方面有点笨拙。 我也希望能够利用 Python 的统计能力。 虽然我不是很清楚如何做到这一点。 我花了很多时间浏览 Python C API 文档。 我遇到了一个函数 PyArray_SimpleNewFromData 显然可以做到这一点。 就代码的整体设置而言,我仍然很不清楚。 我正在构建一些非常简单的测试用例来帮助我理解这个过程。 我在 Visual Studio express 2012 中生成了以下代码作为一个独立的 Empty 项目。我称这个文件为 Project1 #include <Python.h> #include "C:/Python27/Lib/site-packages/numpy/core/include/numpy/arrayobject.h" PyObject * testCreatArray() { float fArray[5] = {0,1,2,3,4}; npy_intp m = 5; PyObject * c = PyArray_SimpleNewFromData(1,&m,PyArray
  • 何时在 C++ 中使用“::”作为全局作用域?(When to use “::” for global scope in C++?)
    问题 每隔一段时间,我就会偶然发现一些我正在维护的代码,这些代码挑战了我对代码风格的看法。 今天是那种日子之一... 我知道您为什么要使用范围运算符来定义全局范围。 事实上,这里没有作用域的作用域解析运算符是一个很好的链接,告诉您原因。 然而,我今天看到了让我思考的事情。 所有有问题的类都被包装到项目的命名空间中(很好!),但我确实看到了全局范围运算符的大量使用。 也就是说,它用于 C 库中的所有内容(除了 uint8_t 等......是的,程序员使用了这个库的 .h 版本,因为显然他们运行的 g++ 版本仍然对新的 C++ 发出警告标准)。 这有用吗? 我认为这只是浪费字符(提醒我使用 this 指针......除了在复制构造函数和赋值运算符的情况下,它有助于阐明哪个对象是哪个)。 我错过了什么吗? 当然,有人可以根据 usleep() 或 stderr 来命名一些东西(我看到最多使用“::”的地方),但他们不知道这样做可能会破坏一些可怕的东西吗? 在什么时候你会根据作用域运算符说“搞砸”,只是告诉自己,有人在你的命名空间中以某种方式命名函数是在自找麻烦? 所以我的问题是......在这种情况下使用全局范围运算符的“正确”(我理解的主观)方式是什么? 未包含在 std 或您自己的命名空间中的所有内容都应明确定义全局范围吗? 我倾向于谨慎行事并使用“std ::”来避免使用指令
  • 在 C++ 中嵌入 python 时导入 tensorflow 返回 null(Importing tensorflow when embedding python in c++ returns null)
    问题 我有一个关于将 python 嵌入到 C++ 应用程序的问题。 设置如下:我有一个大型 C++ 应用程序,它生成一些数据(实时渲染图像)并显示它们。 我还使用 tensorflow 在 python 中训练了一个神经网络,它将接受这些图像。 我的想法是嵌入 python 并将数据作为 numpy 数组发送,使用神经网络进行预测并返回另一个处理过的 numpy 数组以显示(在 C++ 中)。 我在 python 端做了一些没有 tensorflow 的基本测试,以了解在 c 中嵌入 python 等等,它似乎有效。 但是,一旦我将“导入 tensorflow”放入我想要导入的任何 python 脚本中,我就会从 C++ 部分的 PyImport_ImportModule 获得一个 NULL。 例如 import numpy as np def foo(img): return np.clip(img * 2.0, 0, 255).astype(np.uint8) 工作良好。 但以下没有: import numpy as np import tensorflow as tf #this causes the fail def foo(img): return np.clip(img * 2.0, 0, 255).astype(np.uint8) 在第二种情况下,我仍然从
  • 将 Python 类实例传递给 C++ 函数(Passing a Python class instance into a C++ function)
    问题 我有一个用 C++ 编写的内部库,我目前正致力于扩展到 Python。 我从 Boost.Python 开始这项任务,但我对替代方案持开放态度。 目前我有一个 C++ 函数需要接受一个 Python 类实例,然后使用这个对象的方法来执行某些任务。 这个想法是让 Python 用户永远不需要处理 C++。 他们应该从我将提供的 Python 模板/示例类创建这个 Python 对象,并带有我可以假设在我的 C++ 库中的预设方法名称。 向 Python 用户公开的界面如下所示: class Foo(object): def __init__(self, args): """create an instance of this class with instance-specific attributes""" def Bar1(self, a, b, c): """do something with the given integers a, b and c""" pass def Bar2(self, a, b, c): """do something else with the given integers a, b and c""" pass import mylib cheese = mylib.Wine() cheese.do_something(Foo) 在 C++
  • 修改向量的元素(按值,按引用)函数 C++(Modify elements of vector (by value, by reference) Function C++)
    问题 我有一个函数,我必须修改向量的值。 在 C++ 中返回向量是一个好习惯吗? 功能一: vector<string> RemoveSpecialCharacters(vector<string> words) { for (vector<string>::iterator it=words.begin(); it!=words.end(); ) { if(CheckLength(*it) == false) { it = words.erase(it); } else{ ++it; } }//end for return words; } 功能二: void RemoveSpecialCharacters(vector<string> & words) { for (vector<string>::iterator it=words.begin(); it!=words.end(); ) { if(CheckLength(*it) == false) { it = words.erase(it); } else{ ++it; } }//end for } 回答1 您的两个功能用于两个不同的目的。 功能 1:用作remove_copy 。 它不会修改现有的容器; 它复制并修改它。 功能 2:用作remove 。 它将修改现有容器。 回答2 这有点主观。 我个人更喜欢后者
  • 将向量和参数从 Python 传递到 R 函数(Passing vectors and params from Python to R functions)
    问题 我正在学习 Python 和 R,并且在将参数从 Python 传递到名为“Contours”的 R 函数时遇到问题。 下面的作品...... Python (testr.py) import rpy2.robjects as robjects robjects.r(''' source('Wrapper.R') ''') r_myfunc = robjects.globalenv['Contours'] r_myfunc() R (Wrapper.R) source ('./DrawCompRecVark.R') imageDirectory="./tmp/" Contours <- function() { k=c(0,1) sens=c(0.8, 0.9, 0.95, 0.995) spec=0.8 prev=0.001 N=1 uniqueId=1 #graph prepareSaveGraph(imageDirectory, "PPVkSensSpec-", uniqueId) DrawSensSpec(k, sens, spec, prev, N) dev.off() #save the cNPV graph prepareSaveGraph(imageDirectory, "cNPVkSensSpec-", uniqueId) DrawVarcSpec(k
  • 在 C++ 中嵌入 Python 并使用 Boost.Python 从 C++ 代码调用方法(Embedding Python in C++ and calling methods from the C++ code with Boost.Python)
    问题 我尝试将 Python 脚本嵌入到我的 C++ 程序中。 在阅读了一些关于嵌入和扩展的内容后,我了解了如何打开我自己的 Python 脚本以及如何将一些整数传递给它。 但现在我有点不明白如何解决我的问题。 我必须同时执行这两项操作,从 C++ 调用 Python 函数和从我的嵌入式 Python 脚本调用 C++ 函数。 但我不知道我必须从哪里开始。 我知道我必须编译一个 .so 文件才能将我的 C++ 函数公开给 Python 但这我无能为力,因为我必须嵌入我的 Python 文件并使用 C++ 代码控制它(我必须使用脚本语言,使一些逻辑易于编辑)。 那么,有没有办法做到这两件事呢? 从 C++ 调用 Python 函数和从 Python 调用 C++ 函数? 这是我的 C++ 代码 #include <Python.h> #include <boost/python.hpp> using namespace boost::python; // <----------I want to use this struct in my python file--------- struct World { void set(std::string msg) { this->msg = msg; } std::string greet() { return msg; } std
  • C++ 向量到 Python 3.3(C++ vector to Python 3.3)
    问题 我想从 C++ 脚本中获取 python 列表,例如[1,2,3,4] 。 我写了 C++ 脚本,它返回一个向量。 如何在没有 SWIG/SIP/Cython/等的情况下连接末端? 将 C++ 编译为 .exe 或 elf 文件,然后从命令行调用,让 .exe 创建一个包含向量的 .txt 并用 python 读取它会更容易吗? 我的观点是,我只需要一个来自 C++ 的非常小的函数来对大量数据进行大量计算。 做到这一点的最不痛苦和最短的方法是什么? 编辑:举个例子。 Python 会给 C++ 提供一个文件名字符串(“foo.txt”),然后 C++ 将读取文件的上下文(200,000 行 x 300 列),计算缺失值,然后将每行缺失值的数量返回给 Python。 这会产生一个包含 200,000 个数字的列表。 两者之间如何进行这种通信? 为了完整起见,这就是我仍然想知道如何去做的事情: 将 python 文件名字符串传递给 C++ 在 C++ 中接收 python 字符串完成在 C++ 中创建向量将向量返回给 Python 在 Python 中接收向量 回答1 这现在可能没有实际意义,我在你的另一个问题上发布了类似的内容,但我已经针对 Python 3.3 和 C++ 而不是 Python 2.7 和 C 调整了这个版本。 如果您想取回 Python 列表对象
  • 将未知大小的数组传递给函数(Passing array with unknown size to function)
    问题 假设我有一个名为MyFunction(int myArray[][])的函数,它执行一些数组操作。 如果我这样写参数列表,编译器会抱怨它在编译时需要知道数组的大小。 有没有办法重写参数列表,以便我可以将任意大小的数组传递给函数? 我的数组的大小由类中的两个static const int定义,但编译器不会接受类似MyFunction(int myArray[Board::ROWS][Board::COLS]) 。 如果我可以将数组转换为向量,然后将向量传递给MyFunction怎样? 是否有可以使用的单行转换,还是必须手动进行转换? 回答1 在 C++ 语言中,多维数组声明必须始终包括除第一个之外的所有大小。 因此,您尝试做的事情是不可能的。 您不能在没有明确指定大小的情况下声明内置多维数组类型的参数。 如果需要将运行时大小的多维数组传递给函数,则可以忘记使用内置多维数组类型。 这里一种可能的解决方法是使用“模拟”多维数组(指向其他一维数组的指针的一维数组;或通过索引重新计算模拟多维数组的普通一维数组)。 回答2 在 C++ 中,除非您有使用数组的特定原因,否则使用 std::vector 对数组进行建模。 一个名为“myArray”的 3x2 向量被初始化的示例: vector< vector<int> > myArray(3, vector<int>(2,0))
  • 在 C++ 中执行具有任何类型和数量参数的任何函数的函数(A function to execute any function with any types and numbers of parameter in C++)
    问题 我目前有一个函数,它接受任何类型的向量和一个函数作为参数。 传递的函数在执行时计时,并返回结果时间。 函数调用是使用传递的向量调用的,但我想做的是扩展调用,以便可以通过函数调用传递任意数量的参数,并且可以使用任意数量的参数调用它。 该函数的代码如下,可在名为 functions.h 的文件中找到: template<typename X, typename F> double timer(std::vector<X> elements, F function) { clock_t tstart, tend; tstart = clock(); function(elements); tend = clock(); return ((double)tend - tstart) / CLOCKS_PER_SEC; } 函数 mean 只是计算给定值(也在向量中)的平均值。 包括对计时器的调用的 main.cpp 文件在这里: #include <cstdlib> #include <algorithm> #include <numeric> #include <vector> #include <cmath> #include <ctime> #include <iostream> #include "functions.h" int main(void) { std
  • Python 导入和使用 cdll(使用 linux .so 文件)(Python importing & using cdll (with a linux .so file))
    问题 在我最后一个关于 python&c++ 集成的问题之后,我被告知在 Windows 上使用 dll。 (上一个问题) 这样做行得通: cl /LD A.cpp B.cpp C.pp 在windows环境下,设置boost、cryptop源和cryptop库的包含路径后。 现在我正在尝试在 linux 中做同样的事情,创建一个 .so 文件以通过 python2.5 上的 ctypes 导入。 我做了: gcc -Wall -Wextra -pedantic A.cpp B.cpp C.cpp /usr/lib/libcryptopp.so -shared -o /test/decoding.so 并且 so 对象创建正常。 如果删除了“-shared”编译是可以的,但会因为没有主要内容而停止(显然 ;) )。 当然 libcryptopp.so 也存在。 但是当我去 python 并导入“so”文件时,它说该属性没有对象“解密”、“加密”或我放在那里的任何对象。 在 dll 对象上使用“dir”确认它们不存在。 外部函数在 A.cpp 中定义为: int encrypt (params...) //.. return num; int decrypt (params...) //.. return num; 还尝试使用: extern "C" encrypt (params
  • C ++ std :: sort与Class中的谓词功能(C++ std::sort with predicate function in Class)
    问题 我想在特定类中以特定顺序对特定结构的向量进行排序。 我已经在一个类中编写了struct和predicate函数的定义,并在具有这些struct和function的类的方法中运行了std :: sort。 但是发生了编译错误。 gcc版本为4.0.1,操作系统为Mac OSX。 代码如下: class sample { public: struct s { int x; int y; }; bool cmp (struct s a, struct s b) { if (a.x == b.x) return a.y < b.y; else return a.x < b.x; } int func(void) { std::vector <struct s> vec; // ... sort(vec.begin(), vec.end(), cmp); // compilation error // ... return 0; } }; int main(void) { sample *smp = new sample(); smp->func(); return 0; } 错误消息是巨大而复杂的。 所以这是它的前两行。 sortSample.cpp:在成员函数'int sample :: func()'中: sortSample.cpp:51:错误:类型'bool(sample
  • 对派生类指针的 std::vector 的引用作为函数的输入参数(reference to a std::vector of derived class pointers as input parameter to a function)
    问题 首先,如果还有一个类似的问题,我没有找到,我想道歉。 我一直在尝试,但由于问题非常具体,我找不到。 现在,问题。 我有一个基类和一个派生类(比如 BNode 和 DNode ),我有一个 BNode* 的 std::vector。 我还有一个函数,它接收对这些指针的向量的引用。 尝试将指向派生对象的指针的 std::vector 作为参数传递给此函数时遇到问题: class BNode { }; class DNode : public BNode { }; class Other { function(std::vector<BNode*>& inputVector) { } } 当尝试将指针向量传递给派生类时,我从 VS 收到的错误是: 1> error C2664: 'Other::function' : cannot convert parameter 1 'std::vector<T>' to 'std::vector<T> &' 1> with 1> [ 1> T=DNode * 1> ] 1> and 1> [ 1> T=BNode * 1> ] 先谢谢了。 回答1 您的问题是,即使DNode派生自BNode , std::vector<DNode*>也不会派生自std::vector<BNode*> 。 因此,编译器不知道如何从一种类型转换为另一种类型。 但是
  • C++ - Python 绑定与 ctypes - 在函数中返回多个值(C++ - Python Binding with ctypes - Return multiple values in function)
    问题 我发现了这个 C++ Python 绑定示例:Calling C/C++ from python? 根据那里的答案,我创建了一些测试文件: foo.cpp: #include <iostream> #include <utility> int bar_2(int a, int b){ return a*b; } std::pair<int, int> divide(int dividend, int divisor) { return std::make_pair(dividend / divisor, dividend % divisor); } extern "C" { int bar_2_py(int a, int b){ return bar_2(a,b); } std::pair<int, int> divide_py(int d, int div){return divide(d,div);} } fooWrapper.py: #!/usr/bin/env python from ctypes import cdll lib = cdll.LoadLibrary('./libfoo.so') def bar_2(a, b): res = lib.bar_2_py( a,b ) return res def divide(d,div): res = lib
  • 通用编程与元编程(Generic programming vs. Metaprogramming)
    问题 究竟有什么区别? 似乎这些术语可以互换使用,但是在阅读 Objective-c 的维基百科条目时,我遇到了: 除了 C 的过程式编程风格之外,C++ 还直接支持某些形式的面向对象编程、泛型编程和元编程。 参考 C++。 那么显然他们是不同的? 回答1 编程:编写一个程序来创建、转换、过滤、聚合和以其他方式操作数据。 元编程:编写创建,转换,过滤器,聚集和否则操纵程序的程序。 通用编程:编写一个程序来创建、转换、过滤、聚合和以其他方式操作数据,但只对数据结构做出最少的假设,从而最大限度地跨广泛的数据类型重用。 正如在其他几个答案中已经提到的那样,C++ 中的区别可能会令人困惑,因为通用编程和(静态/编译时)元编程都是使用模板完成的。 更让你困惑的是,C++ 中的泛型编程实际上使用元编程来提高效率,即模板特化从泛型生成专门的(快速)程序。 还要注意的是,正如每个 Lisp 程序员都知道的那样,代码和数据是一回事,所以真的没有“元编程”这样的东西,它只是编程。 同样,这在 C++ 中有点难以看到,因为您实际上使用两种完全不同的编程语言进行编程(C++,一种 C 系列中的命令式、过程式、面向对象的语言)和元编程(模板,一种纯函数式的“偶然” “一种介于纯 lambda 演算和 Haskell 之间的语言,语法很丑,因为它实际上从未打算成为一种编程语言。)
  • Python导入文件名包含在变量中的函数(Python importing a function with file's name contained in a variable)
    问题 嗨,我在与我的主脚本相同的文件夹中有一个目录,该文件夹中名为“actions”,主脚本可以随时使用多个脚本。 我现在在一个名为 VAR 的变量中以字符串的形式获得脚本的名称(例如)。 我希望能够使用变量导入此文件。 回答1 如果您的目标只是执行文件,则可以使用 with open(filename) as f: exec(compile(f.read(), filename, "exec")) 或 Python 2.x 函数execfile() 。 如果您确实想使用完整的导入机制导入模块,则需要在目录actions中使用__init__.py ,并且可以使用类似 module = __import__("actions.foo") 导入actions/foo.py 。 回答2 使用__import__函数 __import__(str)
  • 如何将Python自然语言处理速度提升100倍:用spaCy/Cython加速NLP
    所以我决定好好处理这个问题,最后开发出了比之前版本(每秒几千单词)性能提升百倍的 NeuralCoref v3.0(https://github.com/huggingface/neuralcoref) ,同时还保持了同样水准的准确性和易用性。本文中,我会分享在这个项目上总结的一些经验,重点包括:怎样在 Python 中 设计一个高效率的模块。怎样 充分利用 spaCy 的内部数据结构来快速设计极高性能的 NLP函数。**这里我耍了点小花招,因为我们既要谈论 Python,同时还会涉及一些 Cython 内容——不过 Cython 是 Python 的一个超集(http://cython.org/) ,所以不要担心!你现在写的 Python 程序已经是一个 Cython 程序了。下面的一些场景可能对速度有很高的要求:你正在使用 Python为 NLP 开发一个 生产模块;你正在使用 Python 对一个大型 NLP 数据集进行 计算分析;你正在为诸如 pyTorch/TensorFlow 这类深度学习框架 预处理大型训练集,或者深度学习模型采用的 批处理加载器加载了太多复杂逻辑,严重拖慢了训练速度。开始之前再提一句,我还发布了一个 Jupyter notebook(https://github.com/huggingface/100-times-faster-nlp)
  • 编译前使用 Python 代码进行原型设计(Prototyping with Python code before compiling)
    问题 一段时间以来,我一直在考虑编写一个峰值拟合库。 我非常了解 Python,并计划开始在 Python 中实现所有内容,但设想我最终可能不得不用编译语言重新实现一些核心例程。 IIRC,Python 的最初职责之一是作为一种原型语言,但是 Python 在允许将函数、函子、对象传递给函数和方法方面非常自由,而我怀疑 C 或 Fortran 并非如此。 关于设计我认为必须与编译语言接口的函数/类,我应该知道什么? 这些潜在问题中有多少是由 cTypes、bgen、SWIG、Boost.Python、Cython 或 Python SIP 等库处理的? 对于这个特定的用例(拟合库),我想允许用户将数学函数(Guassian、Lorentzian 等)定义为 Python 函数,然后可以通过编译代码拟合库进行解释。 传递和返回数组也是必不可少的。 回答1 最后一个问题,我真的可以给出一个有价值的答案:)。 我为我的工作(光学测量技术博士)研究了 f2py、boost.python、swig、cython 和 pyrex。 我广泛使用 swig,boost.python 一些和 pyrex 和 cython 很多。 我也用过ctypes。 这是我的细分: 免责声明:这是我的个人经验。 我没有参与任何这些项目。 swig:不能很好地使用 C++。 应该可以,但是在 linux 和 Mac
  • 从 DLL 动态导入 C++ 类(Dynamically importing a C++ class from a DLL)
    问题 从 DLL 导入 C++ 类的正确方法是什么? 我们正在使用 Visual C++。 有 dllexport/exports.def+LoadLibrary+GetProcAddress 三重奏,但它不适用于 C++ 类,仅适用于 C 函数。 这是由于 C++ 名称修改吗? 我如何使这项工作? 回答1 您需要添加以下内容: extern "C" { ... } 以避免功能混乱。 您可能会考虑编写两个简单的 C 函数: SomeClass* CreateObjectInstace() { return new SomeClass(); } void ReleaseObject(SomeClass* someClass) { delete someClass; } 通过仅使用这些功能,您可以随后添加/更改对象创建/删除的功能。 这有时被称为工厂。 回答2 在 http://www.codeproject.com/KB/DLL/XDllPt4.aspx 找到解决方案 感谢您的努力男孩和女孩 回答3 我通常声明一个接口基类,在我的应用程序中使用这个声明,然后使用 LoadLibrary、GetProcAddress 来获取工厂函数。 该因子始终返回接口类型的指针。 这是一个实际示例,从动态加载的 DLL 中导出 MFC 文档/视图 回答4 看看这个问题。 基本上,有两种方法。
  • 向量是按值传递还是按C ++中的引用传递给函数(Are vectors passed to functions by value or by reference in C++)
    问题 我在用C ++编写代码。 如果我有一些函数void foo(vector<int> test)并在程序中调用它,则该矢量将通过值或引用传递吗? 我不确定,因为我知道向量和数组是相似的,并且像void bar(int test[])这样的函数将通过引用(指针?)而不是值通过测试。 我的猜测是,如果我想避免按值传递,则需要显式传递指针/引用的矢量,但我不确定。 回答1 如果我不得不猜测,我会说你来自Java背景。 这是C ++,除非您使用&运算符另行指定,否则事情将按值传递(请注意,此运算符还用作“ address-of”运算符,但在不同的上下文中)。 这一切都有据可查,但无论如何我都会重申: void foo(vector<int> bar); // by value void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo) void foo(vector<int> const &bar); // by const-reference 您还可以选择将指针传递给向量( void foo(vector<int> *bar) ),但是除非您知道自己在做什么,否则您会觉得这确实是可行的方法,请不要这样做这。 另外,向量与数组不一样! 在内部,向量会跟踪它为您处理内存管理的数组