作为示例,我们先在python中创建一个二维的numpy数组, 并写入二进制文件:
>>> import numpy as np
>>> a = np.array(range(100),dtype = np.float32)
>>> b = a.reshape((4,-1))
>>> b
array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,
13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.],
[25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37.,
38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49.],
[50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60., 61., 62.,
63., 64., 65., 66., 67., 68., 69., 70., 71., 72., 73., 74.],
[75., 76., 77., 78., 79., 80., 81., 82., 83., 84., 85., 86., 87.,
88., 89., 90., 91., 92., 93., 94., 95., 96., 97., 98., 99.]],
dtype=float32)
>>> b.tofile("d:/numpydata.ha")
接着在C++中从该文件读取数据,放入二维数组中,并将每个元素加1,然后将改变后的数组写到一个新的二进制文件:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
float arr[4][25]={0.0f};
ifstream in("d:\\numpydata.ha", ios::in | ios::binary);
in.read((char*) &arr, sizeof arr);
// 查看读出了多少字节的数据
cout << in.gcount()<<"bytes have been read" << endl;
cout <<endl;
//
for(int i =0;i<4;i++)
{
for(int j=0;j<25;j++)
cout << arr[i][j]++<< ","; //打印后更新(+1)
cout << endl;
}
//cout<<sizeof(arr)/sizeof(arr[0][0])<<endl; //求二维数组元素个数
//将数组写入二进制文件
FILE* fp;
fp = fopen("d:\\numpydata_update.ha", "wb");
fwrite(arr,sizeof(float),sizeof(arr)/sizeof(arr[0][0]),fp);
fclose(fp);
return 0;
}
最后在python中将新文件中的数据读回numpy数组:
x = np.fromfile("d:/numpydata_update.ha",dtype= np.float32)
>>> x
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.,
12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,
23., 24., 25., 26., 27., 28., 29., 30., 31., 32., 33.,
34., 35., 36., 37., 38., 39., 40., 41., 42., 43., 44.,
45., 46., 47., 48., 49., 50., 51., 52., 53., 54., 55.,
56., 57., 58., 59., 60., 61., 62., 63., 64., 65., 66.,
67., 68., 69., 70., 71., 72., 73., 74., 75., 76., 77.,
78., 79., 80., 81., 82., 83., 84., 85., 86., 87., 88.,
89., 90., 91., 92., 93., 94., 95., 96., 97., 98., 99.,
100.], dtype=float32)
>>> x.shape
(100,)
为什么读回的数组变成一维的呢?
因为实际在计算机中并不存在实质上的二维/多维数组,只不过是一片连续的结构化的地址空间。
我们reshape即可得到二维数组:
>>> x = x.reshape((4,-1))
>>> x
array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.,
12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,
23., 24., 25.],
[ 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36.,
37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47.,
48., 49., 50.],
[ 51., 52., 53., 54., 55., 56., 57., 58., 59., 60., 61.,
62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72.,
73., 74., 75.],
[ 76., 77., 78., 79., 80., 81., 82., 83., 84., 85., 86.,
87., 88., 89., 90., 91., 92., 93., 94., 95., 96., 97.,
98., 99., 100.]], dtype=float32)
numpy 数组和 C/C++数组的转换要注意数据类型(字节数)要匹配,
如 numpy 中的 float32 对应 C/C++ 的 float(不同的实现可能会有差异)。
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!