Tengo una función C para normalizar las filas de una matriz en el espacio de registro (esto evita el flujo inferior numérico).Cómo explicar la matriz contigua a la columna al ampliar numpy con C
El prototipo de mi C-función es la siguiente:
void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
Se puede ver que se necesita un puntero a un array y lo modifica en su lugar. Por supuesto, el código C supone que los datos se guardan como una matriz contigua a C, es decir, contigua a la fila.
envuelvo la función como sigue usando Cython (importaciones y cdef extern from
omitidas):
def normalize_logspace(np.ndarray[np.double_t, ndim=2] mat):
cdef Py_ssize_t n, d
n = mat.shape[0]
d = mat.shape[1]
normalize_logspace_matrix(n, d, <double*> mat.data)
return mat
mayoría de las veces numpy-arrays son fila contigua y la función funciona bien. Sin embargo, si una matriz numpy se ha transpuesto previamente, los datos no se copian, sino que se devuelve una nueva vista de los datos. En este caso, mi función falla porque la matriz ya no es fila contigua.
puedo evitar esto mediante la definición de la matriz para tener orden Fortran contiguos, de tal manera que después de la transposición será C contiguas:
A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
Obviamente eso es muy propenso a errores y el usuario tiene que tomar se preocupa de que la matriz esté en el orden correcto, que es algo que el usuario no debería tener que preocuparse en Python.
¿Cuál es la mejor manera de cómo puedo hacer que esto funcione tanto con matrices contiguas como con filas y columnas? Supongo que algún tipo de comprobación de orden de matriz en Cython es el camino a seguir. Por supuesto, preferiría una solución que no requiera copiar los datos en una nueva matriz, pero casi asumo que es necesario.
¿Esta respuesta de 2010 sigue siendo actual, o hay una mejor manera de lograr esto ahora? –
@larsmans: No sé exactamente qué quiere decir con "esto".Escribir una función C que pueda tratar con arreglos bidimensionales Fortran-contiguos y C-contiguos todavía funciona de esta manera, si esto es lo que desea. Si está bien que sus matrices se copien, hay (y ha habido en 2010) otras soluciones. –