前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 从文件读取python numpy 数组

C++ 从文件读取python numpy 数组

作者头像
用户6021899
发布2020-02-26 13:41:33
5.4K0
发布2020-02-26 13:41:33
举报

作为示例,我们先在python中创建一个二维的numpy数组, 并写入二进制文件:

代码语言:javascript
复制
>>> 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,然后将改变后的数组写到一个新的二进制文件:

代码语言:javascript
复制
#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数组:

代码语言:javascript
复制
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即可得到二维数组:

代码语言:javascript
复制
>>> 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(不同的实现可能会有差异)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档