【发布时间】:2011-04-21 19:02:49
【问题描述】:
我有一个 c++ 库,我正在尝试使用 Cython 为 python 包装它。一个函数返回一个 3D 向量数组 (float (*x)[3]),我想从 python 访问该数据。我可以通过做类似的事情来做到这一点
res = [
(self.thisptr.x[j][0],self.thisptr.x[j][1],self.thisptr.x[j][2])
for j in xrange(self.natoms)
]
但我想以 numpy 数组的形式访问它,所以我尝试了 numpy.array ,但速度要慢得多。我也试过了
cdef np.ndarray res = np.zeros([self.thisptr.natoms,3], dtype=np.float)
cdef int i
for i in range(self.natoms):
res[i][0] = self.thisptr.x[i][0]
res[i][1] = self.thisptr.x[i][1]
res[i][2] = self.thisptr.x[i][2]
但比列表版本慢大约三倍。
关于如何更快地将向量列表转换为 numpy 数组的任何建议?
完整的代码是
cimport cython
import numpy as np
cimport numpy as np
ctypedef np.float_t ftype_t
cdef extern from "ccxtc.h" namespace "ccxtc":
cdef cppclass xtc:
xtc(char []) except +
int next()
int natoms
float (*x)[3]
float time
cdef class pyxtc:
cdef xtc *thisptr
def __cinit__(self, char fname[]):
self.thisptr = new xtc(fname)
def __dealloc__(self):
del self.thisptr
property natoms:
def __get__(self):
return self.thisptr.natoms
property x:
def __get__(self):
cdef np.ndarray res = np.zeros([self.thisptr.natoms,3], dtype=np.float)
cdef int i
for i in range(self.natoms):
res[i][0] = self.thisptr.x[i][0]
res[i][1] = self.thisptr.x[i][1]
res[i][2] = self.thisptr.x[i][2]
return res
#return [ (self.thisptr.x[j][0],self.thisptr.x[j][1],self.thisptr.x[j][2]) for j in xrange(self.natoms)]
@cython.boundscheck(False)
def next(self):
return self.thisptr.next()
【问题讨论】:
-
你尝试过 numpys frombuffer 函数吗?
标签: arrays performance numpy cython