11
votes

Comment représenter Inf ou -Inf en Cython avec Numpy?

Je construis un tableau avec un élément Cyron par élément. Je souhaite stocker la constante np.inf (ou -1 * np.inf ) dans certaines entrées. Cependant, cela nécessitera la surcharge de retourner dans Python pour rechercher inf . Y a-t-il un libc.math équivalent de cette constante? Ou une autre valeur qui pourrait facilement être utilisée équivalente à (- 1 * np.inf) et peut être utilisé à partir de Cyron sans frais générale?

Modifier EDIT, vous avoir: xxx


0 commentaires

3 Réponses :


17
votes

Il n'y a pas de littéral pour cela, mais float peut analyser à partir d'une chaîne: xxx

alternativement, math.h peut (presque certainement) déclarer une macro qui évalue à INF, auquel cas vous pouvez simplement utiliser cela: xxx


(il n'y a pas de nettoyage façon de vérifier si l'infini est définie dans Pure Cyron, donc si vous souhaitez couvrir toutes vos bases, vous devez obtenir un hacky. Une façon de le faire est de créer un petit en-tête C, disons Fallbackinf.h : xxx

puis dans votre fichier .pyx: xxx

(Vous ne pouvez pas attribuer à l'infini, parce que c'est une rvalue. Vous pouvez supprimer l'opérateur ternaire si vous #Definkefinhefinez l'infini comme 1,0 / 0,0 dans votre en-tête, mais cela pourrait élever SIGFPE, en fonction de votre compilateur.)

Ceci est définitivement dans le royaume de l'optimisation du culte de la cargaison, cependant.)


6 commentaires

Mais si j'utilise float dans une boucle Cython, cela impliquera-t-il des rappels à Python? J'ai édité ma réponse pour donner un exemple.


En fin de compte, cela appelle pyfloat_asdouble à chaque fois, ce qui n'est pas que lent, mais pas quelque chose que vous voulez faire plus souvent que nécessaire; Attribuez-le à une constante une fois, en dehors de la boucle. Mais j'ai mis à jour ma réponse avec une méthode différente de la compilation.


Merci! Votre CDEF externe ... fonctionne bien. Existe-t-il des systèmes / conditions dans lesquels il pourrait ne pas fonctionner ou devrait-il fonctionner sur une distribution / un système d'exploitation Python?


La macro Infinity a été ajoutée en C99; Si votre Math.h est plus âgé, il n'est pas garanti d'être là (bien que cela soit probablement). En pratique, ça devrait aller bien.


Dernière question: est-il possible de vérifier par programme à l'infini (s'il existe) via Cyron et sinon, par défaut sur float ('Inf') ?


Pas proprement. J'ai ajouté ce que je crois être le moyen le plus simple de ma réponse.



4
votes

Vous pouvez utiliser la bibliothèque de mathématiques de Numpy, voir ici pour ce qui est disponible :

>>> from numpy.distutils.misc_util import get_info
>>> get_info('npymath')
{'define_macros': [], 
 'libraries': ['npymath', 'm'], 
 'library_dirs': ['/usr/lib/python2.7/dist-packages/numpy/core/lib'], 
 'include_dirs': ['/usr/lib/python2.7/dist-packages/numpy/core/include']}


0 commentaires

14
votes

La manière recommandée de le faire en Cython est la suivante: xxx

note, qu'il s'agit d'une "CIMPORT" plutôt que d'une importation régulière. C'est le wrapper officiel de Cyron autour de Numpy 'Code> Npymath .


5 commentaires

I Obtenir l'erreur Erreur fatale: fichier 'Numpy / NPY_MATH.H' non trouvé . Quelqu'un d'autre obtient ça?


@ hlin117, Nope. Probablement quelque chose qui ne va pas avec votre configuration. Cette réponse est toujours la façon recommandée d'obtenir l'infini.


Pouvez-vous fournir une cité pour "la manière recommandée ..."?


Êtes-vous trop pédantique? Si vous souhaitez utiliser les trucs de NUMPY, alors une manière plus propre que d'utiliser un CDEF externe. Si vous souhaitez utiliser Math.h, alors il ressemble à de libc.math cimport infini est maintenant disponible, ce qui pourrait également fonctionner. Ces deux options sont meilleures que les deux autres réponses données, surtout si vous travaillez sur une plate-forme moderne.


Voir également l'exemple d'utilisation cimport ici: CYTHON.READTHEDOCS.IO/EN/LATEST/SRC/TURTORIAL/...