L'obtention de données de ctypes array numpy

Je suis à l'aide d'un Python (via ctypes) enveloppé de la bibliothèque C pour exécuter une série de calcul. À différentes étapes de la course, je veux obtenir des données en Python, et plus précisément numpy tableaux.

L'emballage, je suis en utilisant n'deux types différents de retour pour un tableau de données (qui est d'un intérêt particulier pour moi):

  • ctypes Tableau: Quand je fais type(x) (où x est le ctypes tableau, je reçois un <class 'module_name.wrapper_class_name.c_double_Array_12000'> en retour. Je sais que ces données est une copie des données internes de la documentation et je suis capable d'en faire une numpy tableau facilement:

    >>> np.ctypeslib.as_array(x)

Cela renvoie d'un 1D numpy tableau de données.

  • ctype pointeur vers les données: Dans ce cas, à partir de la bibliothèque, de la documentation, je comprends que je suis un pointeur vers les données stockées et utilisées directement à la bibliothèque. La Whey je ne type(y) (où y est le pointeur), j'ai <class 'module_name.wrapper_class_name.LP_c_double'>. Avec ce cas, je suis toujours en mesure d'indexer les données comme y[0][2], mais je n'ai pu l'obtenir dans numpy par l'intermédiaire d'un super maladroit:

    >>> np.frombuffer(np.core.multiarray.int_asbuffer(
        ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))

J'ai trouvé ça dans un vieux numpy liste de diffusion fil de Travis Oliphant, mais pas dans le numpy de la documentation. Si, au lieu de cette approche que j'ai essayer comme ci-dessus, je reçois le texte suivant:

>>> np.ctypeslib.as_array(y)
...
...  BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'

Est-ce np.frombuffer approche la meilleure ou la seule façon de le faire? Je suis ouvert à d'autres suggestions, mais doit souhaitez tout de même utiliser numpy que j'ai beaucoup de post-traitement de code qui repose sur numpy fonctionnalités que je veux utiliser ces données.

  • Vous avez le contrôle sur le C lib? Pourriez-vous changer l'API de la bibliothèque?
  • Oui - je avoir la source. Je ne suis pas sûr de la façon d'aller bien, comme le pointeur approche permet de Python à agir directement sur les données qui, je suppose, dans certains cas, pourrait être un avantage. Dans mon cas, oui, il y aurait avantage d'avoir tout sortir comme un ctype tableau. Toutes les recommandations?
  • Je vous propose de faire de la bibliothèque un (NumPy-) de la matrice de vous allouer en Python et passer à la bibliothèque. De cette façon, vous pouvez agir sur la même mémoire, mais vous n'avez pas à s'embêter à faire tout maladroit conversions. Vous disposez déjà d'un tableau NumPy, et en passant à une bibliothèque est bien pris en charge par l'aide de numpy.ctypeslib.ndpointer comme type d'argument à la ctypes wrapper de votre fonction. (Si ce n'est pas clair, il suffit de demander...)
InformationsquelleAutor dtlussier | 2010-12-04