在cython中声明numpy数组和c指针

在我的代码中,我通常使用numpy数组来连接方法和类。 优化我的程序的核心部分我使用cython与这些numpy数组的c指针。 不幸的是,我目前声明数组的方式非常长。

例如,假设我有一个应该返回一个numpy数组someArrayNumpy的方法,但是在函数指针中* someArrayPointers应该用于提高速度。 这是我通常如何声明的:

cdef:
    numpy.ndarray someArrayNumpy = numpy.zeros(someArraySize)
    numpy.ndarray[numpy.double_t, ndim=1] someArrayBuff = someArrayNumpy
    double *someArrayPointers = <double *> someArrayBuff.data

[... some Code ...]

return someArrayNumpy

正如你所看到的,这占据了基本上一个数组的3行代码,并且我经常需要声明更多的这些数组。

有没有更紧凑/更聪明的方法来做到这一点? 我想我错过了一些东西。

编辑:

因为它是由J. Martinot-Lagarde提出的,所以我定义了C指针和“numpy指针”。 代码基本上是

for ii in range(someArraySize):
    someArrayPointers[ii] += 1

for ii in range(someArraySize):
    someArrayBuff[ii] += 1

与上面的定义,但我加了“ndim = 1,mode ='c'”只是为了确保。 结果是someArraySize = 1e8(以毫秒为单位的时间):

testMartinot("cPointers")
531.276941299
testMartinot("numpyPointers")
498.730182648

这是我从之前/不同的基准中大致记得的。


你实际上在这里声明了两个numpy数组,第一个是通用的,第二个具有特定的dtype。 你可以跳过第一行,someArrayBuff是一个ndarray。

这给出:

numpy.ndarray[numpy.double_t] someArrayNumpy = numpy.zeros(someArraySize)
double *someArrayPointers = <double *> someArrayNumpy.data

你至少需要两行,因为你使用someArrayPointers并返回someArrayNumpy,所以你必须声明它们。


作为一个附注,如果你声明了数组的维数和类型,你确定指针比ndarray更快吗?

numpy.ndarray[numpy.double_t, ndim=2] someArrayNumpy = numpy.zeros(someArraySize)
链接地址: http://www.djcxy.com/p/87923.html

上一篇: Declaring numpy array and c pointer in cython

下一篇: Cython error message: Buffer has wrong number of dimensions (expected 1, got 2)