投稿

8月, 2021の投稿を表示しています

【データ受け渡し】Pythonで出力したバイナリーデータをC言語で読み込む

イメージ
いつも忘れるのでメモ。 C言語からPython ver. は こちら 。 例えばPython側で import numpy as np f = open("test.dat","wb") for i in range(2):     a = np.array([979517696]).astype("i8")     f.write(a.tobytes())     a = np.array([5]).astype("f8")     f.write(a.tobytes())     a = np.array([10]).astype("i4")     f.write(a.tobytes()) f.close() のように出力したら、C言語側で #include <stdio.h> int main(int argc, char **argv) {         double d;         long long l;         int i;         FILE *file;         char* fname="test.dat";         file = fopen(fname,"rb");         fread(&l,sizeof(l),1,file);         printf("%lld\n", l);         fread(&d,sizeof(d),1,file);         printf("%f\n", d);         fread(&i,sizeof(i),1,file);         printf("%d\n", i);         fclose(file);                  return 0; } のように読み込めば良い。

【データ受け渡し】C言語で出力したバイナリーデータをPythonで読み込む

イメージ
いつも忘れるのでメモ。 PythonからC言語ver. は こちら 。 単純な一次元配列であれば、C言語側で #include <stdio.h> #include <stdlib.h> int main(void) {    FILE* fp;    fp = fopen("test.dat", "wb");    if (fp == NULL) {      printf("Error: Cannot open file.\n");      exit(1);    }       double a[]={-1.5, 10.0};    int N=2;       fwrite(a, sizeof(double), N, fp);       fclose(fp);    } のように出力し、Python側で import numpy as np f=open("test.dat",mode='rb') data=np.fromfile(f,dtype='float',count=-1,sep="") print(data) のように読み込めば良い(※pythonのfloatはc言語の倍精度に相当するのでfloatで読んでいる)。

[python] numpyのhstack(np.r_)が遅いので逐次出力で高速化

イメージ
np.c_(np.hstack)やnp.r_(np.vstack)が遅かったので対処メモ。 例えば、outという配列に、同じ列数のnumpy arrayもしくはint(Error時用)が詰まっているとして、 import numpy as np ... flag=0 outdata=None for data in out: if type(data) is int: continue if flag==0: outdata=data flag=1 else: outdata=np.r_[outdata, data] np.save(outf, outdata) とするとむちゃくちゃ遅いが、最初から(Errorでない場合の)列の数がNだとわかっていれば、一度バイナリに文字列として出力して整形した方がぐっと早くなった(データの大きさや環境にもよるが1日→数時間くらい)。 import numpy as np import os ... with open(outf, mode='wb') as ff:     for p in out:         if type(p) is not int:             for pp in p:                 ff.write('\n'.join(pp.astype("str").tolist()))                 ff.write('\n') with open(outf) as ff:     data=ff.read() data=np.array(data.splitlines()).astype(float) outdata=data.reshape(data.size/N, N) np.save(outf, outdata) os.remove(outf) 大量のデータを扱う場合は後者を試してみると良いかもしれない。