将一个numpy数组转换为Android/Java可读格式?

5

我有一个维度为7000*2048,类型为int16的numpy矩阵,占据硬盘大约40MB的空间。我想在我的Android应用中读取这个矩阵。我尝试将其转换为CSV文件,但文件大小变成了超过500MB,这对于打包到我的Android应用中来说太大了。

我还尝试将其转换为JSON,但文件大小仍然超过了100MB。是否有一种适合的数据格式可以将我的numpy(int16)数组转换为,占用更少的空间,并且在Android/Java中可读?


1
自定义二进制格式怎么样?例如:宽度、高度、其余数据...对于16位整数,它将占用(宽度高度+2)2字节...记得考虑字节序! - Selvin
1
为什么不使用原始二进制格式,而使用FileInputStream - Andrii Omelchenko
压缩它。 - diginoise
1个回答

3

对于一个简单的数组,可以以二进制格式保存numpy数据。我首先使用python将数据转换为2字节有符号整数data = data.astype(">i2")。由于我没有保存任何关于字节序的信息,我将我的numpy数组转换为大端序。然后,我可以使用numpy.ndarray.tofile()函数保存numpy值。

然后,我在Java中读取这个二进制数据:

   String file = "/home/sam/PycharmProjects/train.bin";
   FileInputStream fis = new FileInputStream(file);
   DataInputStream ds = new DataInputStream(fis);

   int count = ds.available();

   short features[][] = new short[count / (2 * 2048)][2048]; //i know the size of my data.
   int idx = 0;


   while (ds.available() > 0) {

    // read two bytes from data input, return short
    short k = ds.readShort();

    int row = idx / 2048;
    int column = idx % 2048;


    features[row][column] = k;
    idx++;

   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接