我有一个numpy矩阵,其尺寸为7000 * 2048,类型为int16,我的磁盘需要大约40MB,我想在我的android应用程序中读取此矩阵,我尝试将其转换为CSV文件,但文件大小变得超过500MB,在我的Android应用程序中包装太多了。
我也尝试将其转换为JSON,但文件大小再次超过100MB,是否有一些合适的数据格式我可以将我的numpy(int16)数组转换为,占用更少的空间并且在Android / Java中可读。
答案 0 :(得分:1)
对于一个简单的数组,可以用二进制格式保存numpy数据,我首先使用python中的data = data.astype(">i2")
将数据更改为2byte Signed Integer。由于我没有保存关于字节序的任何信息,我将我的numpy数组转换为big endian。然后我可以使用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++;
}