簡體   English   中英

在cython中聲明numpy數組和c指針

[英]Declaring numpy array and c pointer in cython

在我的代碼中,我通常使用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(以ms為單位的時間):

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM