Объявление массива 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)