[PYTHON] Array-Pufferobjekt, das mit Cython verwendet werden kann

Ich möchte ein Array-Pufferobjekt verwenden, das sowohl in Python als auch in C auf Cython verwendet werden kann. Es scheint, dass es Cythons cython.view.array und CPythons array.array gibt.

Cython array

Verwenden Sie cython.view.array.

Initialisieren

cython


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

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

Im Fall von Python float würden Sie double with'd 'verwenden. Als Anordnung im Speicher können Sie das Schlüsselwort "mode" in cython verwenden, wie order in numpy.

Als C-Array extrahieren (Speicheransicht)

Durch direktes Zuweisen zu einem Array des entsprechenden Datentyps kann es als C-Array (oder Zeiger) behandelt werden (tatsächlich befindet sich die "Ansicht" für das Array im C-Array).

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

Sie kann nicht nur durch explizite Zuweisung wie oben ausgelöst werden, sondern auch durch Angabe von Funktionsargumenten.

cython


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

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

Python array

Erfordert `Array importieren``` in Python-Anweisungen und` aus cpython cimport array``` als Cython-Typinformationen.

In Benchmark on StackOverflow aus "cython array" Es ist auch schnell ", aber ich weiß nicht, wie es wirklich ist.

Es scheint auch, dass es nur grundlegende eindimensionale Arrays verarbeiten kann. Daher kann es problematisch sein, wenn Sie auf zwei Dimensionen in Cython zugreifen möchten.

Initialisieren

Im Moment ist die einzige Möglichkeit, es so zu machen, dass es wie "numpy.empty ()" funktioniert, die Verwendung von "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)
#Dieser Klon()Die Funktion ist auf der Cython-Seite definiert
# 'zero'Geben Sie an, ob mit einem Schlüsselwort auf Null initialisiert werden soll

Als C-Sequenz extrahieren

dataAn die Mitgliederas_xxxsOder```as_voidptr``Feld ist definiert, dies ist ein Array/Dient als Zeiger.

cython


from libc.stdio cimport printf

 printf ("% c", buffer.data.as_chars [0]) # Gibt das erste Element aus

Der Zugriff auf diesen Zeiger ist gefährlich, da keine Typprüfung erfolgt, aber schnell, da er nicht an GIL gebunden ist.

Ichiou Memoryview-Methode kann zugewiesen werden (aber GIL ist erforderlich). In diesem Fall ist unklar, ob eine Ansicht mit zwei oder mehr Dimensionen erstellt werden kann.

#Einfach zu verwendende Konvertierung unter Python

##Konvertierung in Python-String

eindimensionales Array vom Bytetyp(Aussicht)Im Fall von kann es in eine Python-Zeichenfolge konvertiert werden.

cython


pystring = bytearr.tobytes().decode('utf8')
# Geben Sie die entsprechende Codierung an

##Umstellung auf NumPy ndarray

cython.view.Array ist auch Array.Array kann auch als Pufferobjekt verwendet werden, also numpy.asarray()Und numpy.array()Es scheint, dass es mit konvertiert werden kann.




#Zusammenfassung

Funktionell ist es nicht so anders.

+Wenn Sie Geschwindigkeit wollen, auch wenn es eine Dimension wird```array.array```Wäre besser.
+Wenn Sie es als mehrdimensionales Array in Cython verwenden möchten```cython.view.array```Wäre besser.



Recommended Posts

Array-Pufferobjekt, das mit Cython verwendet werden kann
Wickeln Sie C mit Cython für Python ein
Wrap C ++ mit Cython zur Verwendung von Python
Verwenden Sie Cython mit Jupyter Notebook
TypeError: Der Datentyp für das Objektarray kann nicht geändert werden.
Verwenden Sie DeepL mit Python (für die Artikelübersetzung)
Fügen Sie Attribute von Klassenobjekten mit einer for-Anweisung hinzu
Installieren Sie tweepy mit pip und verwenden Sie es für API 1.1
Verwenden Sie mecab-ipadic-neologd mit igo-python
Verwenden Sie RTX 3090 mit PyTorch
Verwenden Sie ansible mit cygwin
Verwenden Sie pipdeptree mit virtualenv
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mock mit Pytest
Verwenden Sie den Indikator mit pd.merge
Zeilenprofilierung mit Cython
Verwenden Sie Gentelella mit Django
Verwenden Sie Mecab mit Python 3
Verwenden Sie Tensorboard mit Chainer
Verwenden Sie DynamoDB mit Python
Verwenden Sie pip mit MSYS2
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Copyright mit Spacemacs
Verwenden Sie TypeScript mit Django-Kompressor
Verwenden Sie MySQL mit Django
Verwenden Sie Enum mit SQLAlchemy
Verwenden Sie Tensorboard mit NNabla
Verwenden Sie GPS mit Edison
Verwenden Sie nim mit Jupyter
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Drehen Sie ein Array von Zeichenfolgen mit einer for-Anweisung (Python3).