Soy un programador de Python relativamente experimentado, pero no he escrito ninguna C en mucho tiempo y estoy tratando de entender Cython. Intento escribir una función Cython que operará en una columna de un recarray NumPy.Accediendo a las columnas de la matriz de registro NumPy en Cython
El código que tengo hasta ahora está debajo.
recarray_func.pyx:
import numpy as np
cimport numpy as np
cdef packed struct rec_cell0:
np.float32_t f0
np.int64_t i0, i1, i2
def sum(np.ndarray[rec_cell0, ndim=1] recarray):
cdef Py_ssize_t i
cdef rec_cell0 *cell
cdef np.float32_t running_sum = 0
for i in range(recarray.shape[0]):
cell = &recarray[i]
running_sum += cell.f0
return running_sum
En el símbolo del intérprete:
array = np.recarray((100,), names=['f0', 'i0', 'i1', 'i2'],
formats=['f4', 'i8', 'i8', 'i8'])
recarray_func.sum(array)
Esto simplemente resume la columna f0
de la recArray. Se compila y se ejecuta sin problemas.
Mi pregunta es, ¿cómo podría modificar esto para que pueda operar en cualquier columna? En el ejemplo anterior, la columna a suma está codificada y se accede a ella a través de la notación de puntos. ¿Es posible cambiar la función para que la columna a la suma se pase como un parámetro?
algo así podría funcionar: podría pasar en un tipo fusionado como el tipo de running_sum, y pasarlo como un puntero, entonces el molde podría ser de ese tipo. – shaunc