J'ai une fonction C pour normaliser les rangées d'un tableau dans l'espace de journal (cela empêche le sous-dénombrement numérique).Comment comptabiliser un tableau contigu à une colonne lors de l'extension de numpy avec C
Le prototype de mon C-fonction est la suivante:
void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
Vous pouvez voir que cela prend un pointeur sur un tableau et il modifie en place. Le code C suppose bien entendu que les données sont sauvegardées en tant que matrice C-contiguë, c'est-à-dire contiguë à une ligne.
J'enveloppe la fonction comme suit à l'aide cython (importations et cdef extern from
omis):
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
La plupart du temps numpy-réseaux sont rangées contiguës et la fonction fonctionne très bien. Cependant, si un tableau numérique a déjà été transposé, les données ne sont pas copiées mais seulement une nouvelle vue dans les données est retournée. Dans ce cas, ma fonction échoue car le tableau n'est plus contigu à la ligne.
Je peux contourner ce problème en définissant le tableau d'avoir pour Fortran contiguës, de sorte qu'après transposition sera C-contiguë:
A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
Il est évident que c'est très sujette à l'erreur et l'utilisateur doit prendre Veillez à ce que le tableau soit dans le bon ordre, ce qui est quelque chose dont l'utilisateur ne devrait pas avoir besoin dans Python.
Quelle est la meilleure façon de faire en sorte que cela fonctionne avec les tableaux contigus à la fois en ligne et en colonne? Je suppose que la vérification des commandes de tableaux dans Cython est la bonne façon de procéder. Bien sûr, je préfère une solution qui ne nécessite pas de copier les données dans un nouveau tableau, mais je suppose presque que c'est nécessaire.
Cette réponse de 2010 est-elle toujours à jour ou existe-t-il un meilleur moyen d'y parvenir maintenant? –
@larsmans: Je ne sais pas exactement ce que vous entendez par "ceci".L'écriture d'une fonction C capable de traiter à la fois les tableaux bidimensionnels Fortran-contigus et C-contigus fonctionne toujours de cette façon, si c'est ce que vous voulez. Si tout va bien que vos tableaux soient copiés, il existe (et a été en 2010) d'autres solutions. –