Tag: numpy

性能上扩展python / numpy的最佳方法

因为有很多方法可以为python编写二进制模块,所以如果我希望尽可能地提高代码的某些段的性能,那么我可以根据经验提出最佳方法的建议。 据我所知,可以使用python / numpy C-api编写扩展,或者包装一些已经编写的纯C / C ++ / Fortran函数,以便从python代码中调用。 当然,像Cython这样的工具是最简单的方法,但我认为手动编写代码可以提供更好的控制并提供更好的性能。 问题,也可能是一般性的,是使用哪种方法。 写一个C或C ++扩展名? 包装外部C / C ++函数或使用回调到python函数? 我在阅读Langtangen的“计算科学的Python脚本”第10章后写了这个问题,其中有几种方法可以比较python和C之间的接口。

编译多个模块时,import_array()出现Numpy / CAPI错误

我正在尝试编译一个C ++模块,用于scipy.weave ,它由几个头文件和源C ++文件组成。 这些文件包含广泛使用Numpy / C-API接口的类和方法。 但我没有弄清楚如何成功地包含import_array() 。 过去一周我一直在努力解决这个问题,我很疯狂。 我希望你可以帮助我,因为weave 帮助不是很清楚。 在实践中,我首先有一个名为pycapi_utils的模块,它包含一些用C对象与Python对象接口的例程。 它pycapi_utils.h文件pycapi_utils.h和源文件pycapi_utils.cpp例如: //pycapi_utils.h #if ! defined _PYCAPI_UTILS_H #define _PYCAPI_UTILS_H 1 #include #include #include #include #include typedef std::tuple pykeyval; //Tuple type (string,Pyobj*) as dictionary entry (key,val) typedef std::list kvlist; //Declaration of methods PyObject* array_double_to_pyobj(double* v_c, long int NUMEL); //Convert from array to Python list […]

如何将数组从c ++传递给python函数并将python返回的数组检索到c ++

我正在写一个c ++程序来调用python函数并检索返回数组。但我总是得到如下错误: 只有length-1数组才能转换为Python标量 和我的c ++代码: int main(int argc, char *argv[]) { int i; PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue; if (argc 3 ) { pArgs = PyTuple_New(argc – 3); for (i = 0; i < argc – 3; i++) { pValue = PyInt_FromLong(atoi(argv[i + 3])); if (!pValue) { PyErr_Print(); return 1; } PyTuple_SetItem(pArgs, i, […]

使这个C数组处理代码更加python(甚至numpy)

我试图了解python的惊人列表处理能力(最终是numpy)。 我正在转换我编写的一些C代码到python。 我有一个文本数据文件,其中第一行是标题,然后每个奇数行是我的输入数据,每个偶数行是我的输出数据。 所有数据空间分开。 我很高兴能够使用嵌套列表推导将所有数据读入列表。 太棒了。 with open(‘data.txt’, ‘r’) as f: # get all lines as a list of strings lines = list(f) # convert header row to list of ints and get info header = map(int, lines[0].split(‘ ‘)) num_samples = header[0] input_dim = header[1] output_dim = header[2] del header # bad ass list comprehensions […]

与astype(int)相比,numpy around / rint slow

所以,如果我有像x=np.random.rand(60000)*400-200 。 iPython的%timeit说: x.astype(int)需要0.14ms np.rint(x)和np.around(x)需要1.01ms 请注意,在rint和around情况下,您仍然需要花费额外的0.14ms来做最终的astype(int) (假设这是你最终想要的)。 问题:我认为大多数现代硬件都能够在同等时间内完成两项操作。 如果是这样的话,为什么numpy需要花费8倍的时间来进行舍入? 碰巧我对算术的准确性并不十分挑剔,但我看不出如何利用numpy(我正在做杂乱的生物学而不是粒子物理学)。

如何从C创建一个numpy记录数组

在Python方面,我可以创建新的numpy记录数组,如下所示: numpy.zeros((3,), dtype=[(‘a’, ‘i4’), (‘b’, ‘U5’)]) 我如何从C程序中做同样的事情? 我想我必须调用PyArray_SimpleNewFromDescr(nd, dims, descr) ,但是如何构造一个适合作为第三个参数传递给PyArray_SimpleNewFromDescr ?

正确的方法将numpy.matrix转换为C双指针

将numpy矩阵作为参数传递给C函数采用双指针的规范方法是什么? 上下文 :我使用numpyvalidation一些C代码 – 我有一个C函数,它接受const double ** const ,我使用ctypes从Python调用.so 。 我试过了: func.argtypes = ctypeslib.ndpointer(dtype=double, ndim=2, flags=”C_CONTIGUOUS”) 直接传递numpy矩阵(不起作用),以及 func.argtypes = ctypes.POINTER(ctypes.POINTER(ctypes.c_double)) 然后通过各种演员numpy传递numpy矩阵。 Casting导致了Python错误 TypeError: _type_ must have storage info 注意 :这个问题在几年前出现在这里 ,但没有完全成功的解决方案。

将Cython中的numpy数组传递给需要动态分配数组的C函数

我有一些C代码具有以下声明: int myfunc(int m, int n, const double **a, double **b, double *c); 所以a是一个常数的二维数组, b是一个二维数组, c是一维数组,都是动态分配的。 b和c在传递给myfunc之前不需要任何具体的东西,应该被理解为输出信息。 出于这个问题的目的, 我不允许更改myfunc的声明。 问题1:如何将给定的numpy数组a_np转换为具有此C函数所需格式的数组a ,以便我可以在Cython中使用?调用此C函数? 问题2:下面的b和c的声明是否正确,或者它们是否需要采用其他格式才能使C函数将其理解为2D和1D数组(分别)? 我的尝试: myfile.pxd cdef extern from “myfile.h”: int myfunc(int p, int q, const double **a, double **b, double *c) mytest.pyx cimport cython cimport myfile import numpy as np cimport numpy as np p = […]

在Python模块中嵌入Python脚本时的ImportError和PyExc_SystemError(.so文件)

我正在尝试用C语言编写一个演示PAM模块,该模块使用C语言中的嵌入式Python来运行用python(2.7)编写的脚本,在pam_sm_authenticate()函数内部,该函数用C文件(pam_auth.c)编写。 这是python脚本:test.py import math import numpy def test_func(): a = “test” return a test.py的路径是/usr/lib/Python2.7/,以便我可以轻松导入它。 这是C文件: #define PAM_SM_AUTH #define PAM_SM_ACCOUNT #define PAM_SM_SESSION #include #include #include #include #include #include #include #define NOBODY “nobody” /*PAM Stuffs*/ PAM_EXTERN int pam_sm_authenticate( pam_handle_t* pamh, int flags, int argc, const char** argv) { const char *user; int retval; user = NULL; retval […]

用ctypes从python调用c:传递向量

我想使用ctypes从python调用ac函数。 从文档中我不明白如何将指针传递给向量。 我要调用的函数是: double f(int n, double* x) { int i; double p=1; for (i=0; i< n; i ++) p = p * x[i]; return p; } 我用void指针修改了函数,因此它变为f(int, void*) ,内部强制转换为double。 我做了以下事情: def f(x): n = len(x) libc = ‘/path/to/lib.so’ cn = c_int(n) px = pointer(x) cx = c_void_p(px) libc.restype = c_double L = libc.f(cn, cx) […]