Объявление массива numpy и указателя c в cython

в моем коде я обычно использую массивы numpy для взаимодействия между методами и классами. Оптимизируя основные части моей программы, я использую cython с указателями c этих массивов numpy. К сожалению, способ, которым я в настоящее время объявляю массивы, довольно длинный.

например, предположим, у меня есть метод, который должен возвращать массив 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 строки кода для в основном одного массива, и часто мне приходится объявлять больше этих массивов.

есть ли более компактный/умный способ сделать это? Мне кажется, я что-то упускаю.

EDIT:

поэтому, потому что это было задано 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 (time in ms):

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

это то, что я примерно помню из предыдущих/разных тестов.

1 ответов


вы фактически объявляете два массива numpy здесь, первый из них является общим, а второй имеет определенный dtype. Вы можете пропустить первую строку, someArrayBuff-это ndarray.

это дает :

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

вам нужно как минимум две строки, потому что вы используете someArrayPointers и возвращаете someArrayNumpy, поэтому вы должны их объявить.


в качестве примечания вы уверены, что указатели быстрее, чем ndarrays, если вы объявите тип и число размерности массива ?

numpy.ndarray[numpy.double_t, ndim=2] someArrayNumpy = numpy.zeros(someArraySize)