Python 用复数数组环化C函数
我正在分析分子动力学模拟数据,我想计算原子轨迹的中子散射光谱,与我的实验进行比较 我最初用纯Python编写了一些东西,但它相当长,所以我想用C编写这部分代码,并从Python调用C函数 为此,我需要每个时间帧的一个原子坐标数组,一个求平均值的倒数空间q向量数组,以及周期性的单元维数。 一切都放在一个复指数中,并在q向量、时间原点和原子上求平均值 问题来了,当从Python调用C函数时,如何使用复数数组? 我总是在PowerShell中使用nmake时出现以下语法错误:Python 用复数数组环化C函数,python,c,cython,Python,C,Cython,我正在分析分子动力学模拟数据,我想计算原子轨迹的中子散射光谱,与我的实验进行比较 我最初用纯Python编写了一些东西,但它相当长,所以我想用C编写这部分代码,并从Python调用C函数 为此,我需要每个时间帧的一个原子坐标数组,一个求平均值的倒数空间q向量数组,以及周期性的单元维数。 一切都放在一个复指数中,并在q向量、时间原点和原子上求平均值 问题来了,当从Python调用C函数时,如何使用复数数组? 我总是在PowerShell中使用nmake时出现以下语法错误: package/lib/
package/lib/src\compIntScatFunc.h(8): error C2143: erreur de syntaxe : absence de ')' avant '*'
package/lib/src\compIntScatFunc.h(8): error C2143: erreur de syntaxe : absence de '{' avant '*'
package/lib/src\compIntScatFunc.h(8): error C2059: erreur de syntaxe : 'type'
package/lib/src\compIntScatFunc.h(9): error C2059: erreur de syntaxe : ')'
package/lib/pycompIntScatFunc.c(1107): error C2061: erreur de syntaxe : identificateur '__pyx_t_double_complex'
package/lib/pycompIntScatFunc.c(1107): error C2059: erreur de syntaxe : ';'
package/lib/pycompIntScatFunc.c(1112): error C2061: erreur de syntaxe : identificateur '__pyx_t_double_complex_from_parts'
package/lib/pycompIntScatFunc.c(1112): error C2059: erreur de syntaxe : ';'
package/lib/pycompIntScatFunc.c(1112): error C2059: erreur de syntaxe : '<parameter-list>'
package/lib/pycompIntScatFunc.c(1119): error C2061: erreur de syntaxe : identificateur '__pyx_t_float_complex'
package/lib/pycompIntScatFunc.c(1119): error C2059: erreur de syntaxe : ';'
package/lib/pycompIntScatFunc.c(1124): error C2061: erreur de syntaxe : identificateur '__pyx_t_float_complex_from_parts'
package/lib/pycompIntScatFunc.c(1124): error C2059: erreur de syntaxe : ';'
package/lib/pycompIntScatFunc.c(1124): error C2059: erreur de syntaxe : '<parameter-list>'
package/lib/pycompIntScatFunc.c(1644): error C2065: '__pyx_t_double_complex' : identificateur non déclaré
package/lib/pycompIntScatFunc.c(1921): warning C4013: 'compIntScatFunc' non défini(e) ; extern retournant int pris par défaut
package/lib/pycompIntScatFunc.c(1921): error C2065: '__pyx_t_double_complex' : identificateur non déclaré
package/lib/pycompIntScatFunc.c(1921): error C2059: erreur de syntaxe : ')'
package/lib/pycompIntScatFunc.c(6580): error C2061: erreur de syntaxe : identificateur '__pyx_t_double_complex_from_parts'
package/lib/pycompIntScatFunc.c(6580): error C2059: erreur de syntaxe : ';'
package/lib/pycompIntScatFunc.c(6580): error C2059: erreur de syntaxe : '<parameter-list>'
package/lib/pycompIntScatFunc.c(6779): error C2061: erreur de syntaxe : identificateur '__pyx_t_float_complex_from_parts'
package/lib/pycompIntScatFunc.c(6779): error C2059: erreur de syntaxe : ';'
package/lib/pycompIntScatFunc.c(6779): error C2059: erreur de syntaxe : '<parameter-list>'
好的,实际上,添加以下内容:
[build]
compiler=gcc
使用这里描述的补丁方法:解决了这个问题
现在已经编译好了,谢谢。编译扩展时使用哪种编译器?MSVC?是的,的确,cl需要编译。我在gcc中遇到了这个错误:“未知的MS编译器版本1900”(我看到有一些补丁)。有没有办法让MSVC发挥作用?我是否需要使用VisualStudio工具安装python?
cimport numpy as np
cimport cython
np.import_array()
cdef extern from "compIntScatFunc.h":
void compIntScatFunc(double *atomPos, int atomPos_dim0, int atomPos_dim1, int atomPos_dim2,
double *qVecs, int qVecs_dim0, int qVecs_dim1, int qVecs_dim2,
double complex *out, int out_dim0, int out_dim1,
double *cellDims, int nbrBins, int minFrames, int maxFrames)
@cython.boundscheck(False)
@cython.wraparound(False)
def py_compIntScatFunc( np.ndarray[double, ndim=3, mode="c"] atomPos not None,
np.ndarray[double, ndim=3, mode="c"] qVecs not None,
np.ndarray[np.complex128_t, ndim=2, mode="c"] out not None,
np.ndarray[double, ndim=1, mode="c"] cellDims not None,
nbrBins, minFrames, maxFrames ):
compIntScatFunc(<double*> np.PyArray_DATA(atomPos), atomPos.shape[0], atomPos.shape[1], atomPos.shape[2],
<double*> np.PyArray_DATA(qVecs), qVecs.shape[0], qVecs.shape[1], qVecs.shape[2],
<double complex*> np.PyArray_DATA(out), out.shape[0], out.shape[1],
<double*> np.PyArray_DATA(cellDims), nbrBins, minFrames, maxFrames )
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy as np
with open('README.md', 'r') as f:
description = f.read()
packagesList = [ 'package',
'package.dataManipulation',
'package.dataParsers',
'package.dataConverters',
'package.helpersFunctions',
'package.test' ]
pycompIntScatFunc_ext = Extension( "pycompIntScatFunc",
["package/lib/pycompIntScatFunc.pyx", "package/lib/src/compIntScatFunc.c"],
include_dirs=["package/lib/src", np.get_include()],
libraries=["compIntScatFunc"],
library_dirs=["pacakge/lib/"] )
setup( name='NAMDAnalyzer',
version='alpha',
description=description,
author='Kevin Pounot',
author_email='kpounot@hotmail.fr',
url='github.com/kpounot/NAMDAnalyzer',
packages=packagesList,
ext_modules=cythonize( [pycompIntScatFunc_ext] ) )
[build]
compiler=gcc