C / Python> Lesen Sie den Wert fwrite () in C in Python> v0.1: 1 Wert / v0.2: 3 Werte / v0.3: entspricht size_t / v0.4: Doppelkomplextyp lesen

Betriebsumgebung


GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4

Ich möchte ein Bild des Koeffizienten anzeigen, der durch C ++ - Code mit Jupyter / matplotlib generiert wurde. Dazu lese ich wahrscheinlich das Ergebnis von C fwrite () in Python.

Ich habe versucht, es umzusetzen.

v0.1 (1 Wert)

C (write)

writeTest.c


#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *wfp;
	float pi = 3.141592;

	wfp = fopen("sample.bin","wb");
	fwrite(&pi, sizeof(float), 1, wfp);
	fclose(wfp);
}

Python (read)

Referenz http://stackoverflow.com/questions/2146031/what-is-the-equivalent-of-fread-from-matlab-in-python

readTest.py


import numpy as np
import array

with open("sample.bin") as rfp:
	a = array.array("f") # f: typecode for float
	a.fromfile(rfp, 1)
	print (a)

Der obige Typcode basiert auf dem Folgenden. https://docs.python.org/3.1/library/array.html

Lauf

sample.bin Generation

$ gcc writeTest.c && ./a.out

read sample.bin

$ python readTest.py 
array('f', [3.141592025756836]) 

Ich lese.

v0.2 (3 Werte)

C (write)

writeTest.c


#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *wfp;
	float pi = 3.141592;
	float napier = 2.718;
	float avogadro1 = 6.022;

	wfp = fopen("sample.bin","wb");
	fwrite(&pi, sizeof(float), 1, wfp);
	fwrite(&napier, sizeof(float), 1, wfp);
	fwrite(&avogadro1, sizeof(float), 1, wfp);
	fclose(wfp);
}

Python (read)

readTest.py


import numpy as np
import array

with open("sample.bin","rb") as rfp:
	a = array.array("f") # f: typecode for float
	a.fromfile(rfp, 3)
	print (a)

Lauf

sample.bin Generation

$ gcc writeTest.c && ./a.out

read sample.bin

$ python readTest.py 
array('f', [3.141592025756836, 2.7179999351501465, 6.021999835968018])

v0.3 (size_t) kompatibel

(Ergänzung 19.12.2016)

Ich bin beim Lesen des Typs size_t gestolpert. v0.1 @ http://qiita.com/7of9/items/68673ac3239532064c28

size_t Typ

sizeofPrint.c


#include <stdio.h>
#include <stdlib.h>

int main(void) {
	printf("%ld\n", sizeof(size_t));
	printf("%ld\n", sizeof(int));
}

Lauf


$ gcc sizeofPrint.c && ./a.out 
8
4

In dieser Umgebung ist "size_t" 8.

C (write)

writeTest.c


#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *wfp;
	size_t pi = 314;
	float napier = 2.718;
	float avogadro1 = 6.022;

	wfp = fopen("sample.bin","wb");
	fwrite(&pi, sizeof(size_t), 1, wfp);
	fwrite(&napier, sizeof(float), 1, wfp);
	fwrite(&avogadro1, sizeof(float), 1, wfp);
	fclose(wfp);
}

Python (read)

Um den Wert von size_t (sizeof () = 8) auf der Python-Seite zu lesen, wäre dies der Typ [unsigned long].

https://docs.python.org/3.1/library/array.html Nach L

readTest.py


import numpy as np
import array

with open("sample.bin","rb") as rfp:
	szv = array.array("L") # L: typecodef for [unsigned long]
	szv.fromfile(rfp, 1)
	print (szv)
	flv = array.array("f") # f: typecode for float
	flv.fromfile(rfp, 2)
	print (flv)

Lauf


$ python readTest.py 
array('L', [314L])
array('f', [2.7179999351501465, 6.021999835968018])

v0.4 (doppeltes komplexes Lesen)

(Ergänzung 2016/12/20)

Wie lese ich den Typ mit dem doppelten Komplex? Ich habe es vorerst als Doppeltyp gelesen.

C (write)

Es unterscheidet sich vom tatsächlichen Wert der Abogadro-Zahl, aber vorerst.

writeTest.c


#include <stdio.h>
#include <stdlib.h>
#include <complex.h>

int main(void){
	FILE *wfp;
	size_t pi = 314;
	float napier = 2.718;
	double complex avogadro = 6.022 + 10.23 * I; 

	wfp = fopen("sample.bin","wb");
	fwrite(&pi, sizeof(size_t), 1, wfp);
	fwrite(&napier, sizeof(float), 1, wfp);
	fwrite(&avogadro, sizeof(double complex), 1, wfp);
	fclose(wfp);
}

Python (read)

readTest.py


import numpy as np
import array

with open("sample.bin","rb") as rfp:
	szv = array.array("L") # L: typecodef for [unsigned long]
	szv.fromfile(rfp, 1)
	print (szv)
	napier = array.array("f") # f: typecode for float
	napier.fromfile(rfp, 1)
	print (napier)
	avogadro = array.array("d") # d: typecode for double
	avogadro.fromfile(rfp, 2) # real and imaginary part of the complex number
	print (avogadro)

Lauf


$ gcc writeTest.c && ./a.out
$ python readTest.py 
array('L', [314L])
array('f', [2.7179999351501465])
array('d', [6.022, 10.23])

Vorläufig konnte ich den Realteil und den Imaginärteil des Doppelkomplexes lesen. Ist es eine Methode wie das Umwandeln in einen komplexen Typ, der auf den beiden Werten basiert?

Recommended Posts

C / Python> Lesen Sie den Wert fwrite () in C in Python> v0.1: 1 Wert / v0.2: 3 Werte / v0.3: entspricht size_t / v0.4: Doppelkomplextyp lesen
Lesen Sie json mit C # und konvertieren Sie es in den Wörterbuchtyp (erzwungen)
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Geben Sie Notizen zu Python-Skripten ein, um das PyTorch-Modell in C ++ mit libtorch auszuführen
So generieren Sie eine Sequenz in Python und C ++
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht
So rufen Sie den n-ten größten Wert in Python ab
Konvertieren Sie den Webpay-Entitätstyp in den Dict-Typ (rekursiv in Python).
[Python] So geben Sie Listenwerte der Reihe nach aus
Lesen von CSVs, die in Python nur Ganzzahlen enthalten
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.