将多维数组Java转换为字节,如NumPy

3okqufwl  于 2023-06-23  发布在  Java
关注(0)|答案(1)|浏览(107)

在开放式问题之后:Java equivalent for the NumPy multi-dimensional object,我最终在Java中实现了自己的数值方法。但最终的输出似乎太大了(几乎是NumPy的两倍)。Python没有int、long、float或double等数值类型,但我相信NumPy会将所有内容转换为字节。由于我用Java实现了我的程序,我不得不使用那些标准的数字类型(double [][][],long [][]等...),当我通过FileWriter将结果保存到文件中时,输出的大小几乎是NumPy函数的两倍:

FileWriter fstream = new FileWriter(outName, true);
BufferedWriter out = new BufferedWriter(fstream);

for (int i = 0; i < nFramesBack; i += 2) {
    double[][] data1 = imageObjArray[i];
    for (int j = 0; j < 128; j++) {
        for (int k = 0; k < 128; k++) {
            imageObjArray[i][j][k] = data1[j][k] * flatfB[j][k];
            out.write(data1[j][k] * flatfB[j][k] + " ");
        }
        out.newLine();
    }
    out.newLine();
}
out.flush();
out.close();

我正在寻找一个解决方案,将我的输出转换为像NumPy这样的字节格式。

ykejflvf

ykejflvf1#

在Java中,可以使用DataOutputStream类以二进制格式编写数值数据,这有助于减小输出文件的大小。下面是一个如何修改代码以将数据写入字节的示例:

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        String outName = "output.bin";

        try (DataOutputStream out = new DataOutputStream(new FileOutputStream(outName))) {
            for (int i = 0; i < nFramesBack; i += 2) {
                double[][] data1 = imageObjArray[i];
                for (int j = 0; j < 128; j++) {
                    for (int k = 0; k < 128; k++) {
                        double value = data1[j][k] * flatfB[j][k];
                        out.writeDouble(value);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在此代码中,我们使用DataOutputStream,而不是使用FileWriter和BufferedWriter,通过writeDouble()方法将double值写入二进制数据。与将值写入文本相比,这将以更紧凑的形式写入值。
通过使用二进制格式,可以显著减小输出文件的大小,尤其是在处理大型数值数组时。

相关问题