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 ''.
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.
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.
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é
data
Aux membresas_xxxs
Ou```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