[PYTHON] Objet de tampon de tableau pouvant être utilisé avec Cython

Je souhaite utiliser un objet de tampon de tableau qui peut être utilisé à la fois en Python et en C sur Cython. Il semble qu'il y ait «cython.view.array» de Cython et «array.array» de CPython.

Cython array

Utilisez `` cython.view.array ''.

Initialisation

cython


from cython.view cimport array # note that this is 'c'-import

arr = array(shape=(3,3,3), itemsize=sizeof(int), format='i')

Dans le cas de Python float, vous utiliseriez double with'd '. En tant qu'agencement en mémoire, vous pouvez utiliser le mot-clé "mode" dans cython, comme order dans numpy.

Extraire en tant que tableau C (vue mémoire)

En l'assignant directement à un tableau du type de données correspondant, il peut être traité comme un tableau C (ou pointeur) (en fait, la «vue» du tableau sera dans le tableau C).

cython


from cython.view cimport array

arr = array(shape=(3, 10), itemsize=sizeof(double), format='d')

cdef double[:,:] carr2d = arr  # 2D C-array view
cdef double[:]   carr1d = arr  # 1D C-array view

Il peut être déclenché non seulement par une affectation explicite comme ci-dessus, mais également en spécifiant des arguments de fonction.

cython


cpdef double process(double[:,:] view) nogil:
    ...

arr = array(shape=(3, 10), itemsize=sizeof(double), format='d')
process(arr)

Python array

Import array est requis dans l'instruction Python, et `` `from cpython cimport array``` est requis comme informations de type de Cython.

Dans Benchmark on StackOverflow, à partir de "cython array" C'est aussi rapide », mais je ne sais pas comment c'est vraiment.

En outre, il semble qu'il ne puisse gérer que les tableaux 1-dimensionnels de base, donc cela peut être gênant si vous souhaitez accéder à 2 dimensions dans Cython.

Initialisation

Pour l'instant, la seule façon de le faire fonctionner comme numpy.empty () '' est d'utiliser clone () ''.

cython


from cpython cimport array as carray
import array

cdef carray.array template = array.array('d')
cdef carray.array buffer   = carray.clone(template, 1000, zero=False)
#Ce clone()La fonction est définie côté cython
# 'zero'Spécifiez s'il faut initialiser à zéro avec un mot-clé

Extraire comme séquence C

dataAux membresas_xxxsOu```as_voidptr``Le champ est défini, c'est un tableau/Agit comme un pointeur.

cython


from libc.stdio cimport printf

 printf ("% c", buffer.data.as_chars [0]) # Imprimer le premier élément

L'accès à ce pointeur est dangereux car il n'y a pas de vérification de type, mais c'est rapide car il n'est pas lié par GIL.

La méthode Ichiou memoryview peut être attribuée (mais GIL est requis). Dans ce cas, il est difficile de savoir si une vue de deux dimensions ou plus peut être créée.

#Conversion facile à utiliser sur Python

##Conversion en chaîne Python

tableau unidimensionnel de type octet(Vue)Dans le cas de, il peut être converti en une chaîne Python.

cython


pystring = bytearr.tobytes().decode('utf8')
# Spécifiez le codage approprié

##Conversion en NumPy ndarray

cython.view.array est aussi array.array peut également être utilisé comme objet tampon, donc numpy.asarray()Et engourdi.array()Il semble qu'il puisse être converti avec.




#Résumé

Fonctionnellement, ce n'est pas si différent.

+Si vous voulez de la vitesse même si cela devient une dimension```array.array```Serait mieux.
+Si vous souhaitez l'utiliser comme un tableau multidimensionnel en Cython```cython.view.array```Serait mieux.



Recommended Posts

Objet de tampon de tableau pouvant être utilisé avec Cython
Envelopper C avec Cython pour une utilisation à partir de Python
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Utiliser Cython avec Jupyter Notebook
TypeError: impossible de modifier le type de données pour le tableau d'objets.
Utiliser DeepL avec python (pour la traduction d'articles)
Ajouter des attributs d'objets de classe avec une instruction for
Installez tweepy avec pip et utilisez-le pour l'API 1.1
Utilisez mecab-ipadic-neologd avec igo-python
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Utiliser l'indicateur avec pd.merge
Profilage de lignes avec Cython
Utiliser Gentelella avec Django
Utiliser mecab avec Python 3
Utiliser tensorboard avec Chainer
Utiliser DynamoDB avec Python
Utiliser pip avec MSYS2
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser TypeScript avec django-compresseur
Utiliser MySQL avec Django
Utiliser Enum avec SQLAlchemy
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Utilisez nim avec Jupyter
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Tourner un tableau de chaînes avec une instruction for (Python3)