使用numpy.fromfile读取Python中ObjectOutputStream用Java编写的二进制双精度文件
我已经使用Java中ObjectOutputStream的writeDouble()函数将二进制格式的double数组写入了一个文件。当我尝试使用numpy.fromfile在Python上读取此文件时,它不会给出相同的值。当我尝试使用seek()进行位移动时,它仍然没有帮助 如果我对32位int执行相同的过程,它是有效的,但是我总是需要使用seek()迭代文件的开头部分,因为我无法区分它是胡言乱语 相关Java代码:使用numpy.fromfile读取Python中ObjectOutputStream用Java编写的二进制双精度文件,java,python,numpy,Java,Python,Numpy,我已经使用Java中ObjectOutputStream的writeDouble()函数将二进制格式的double数组写入了一个文件。当我尝试使用numpy.fromfile在Python上读取此文件时,它不会给出相同的值。当我尝试使用seek()进行位移动时,它仍然没有帮助 如果我对32位int执行相同的过程,它是有效的,但是我总是需要使用seek()迭代文件的开头部分,因为我无法区分它是胡言乱语 相关Java代码: //arr is an array of type double try {
//arr is an array of type double
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.bin"));
for (int i = 1; i <= 10; i++) {
out.writeDouble(arr[i]);
}
out.close();
} catch (IOException ex) {
Logger.getLogger(Project.class.getName()).log(Level.SEVERE, null, ex);
}
几乎相同,但现在没有向文件添加元数据:
OutputStream os = new FileOutputStream("data.bin");
DataOutputStream dos = new DataOutputStream( os );
for (int i = 1; i <= 10; i++) {
dos.writeDouble(arr[i]);
}
OutputStream os=新文件OutputStream(“data.bin”);
DataOutputStream dos=新的DataOutputStream(os);
对于(int i=1;i我知道这已经有几年了。对于子孙后代,以下是我如何使用DataOutputStream.writeFloat()
根据,DataOutputStream
以大端写。Numpy显然希望二进制文件以小端写,反之亦然。解决方案是对接收到的数组执行byteswap()
np.fromfile('filename', np.float32).byteswap()
当您使用double
s时,我怀疑您需要将np.float64
作为第二个参数传入。如果不起作用,下面是numpy的dtype
的完整列表:
对象输出流序列化Java对象-它不适合传输到其他语言。您最好以某种格式(CSV、JSON、XML等)编写您的值编辑:或者在这种情况下,显式地以numpy expects的格式编写它。我如何显式地以numpy expects的格式编写它呢?我认为Java的double和numpy的float64是一样的。非常感谢你。就我个人而言,似乎是这样的,我会从我不是numpy
用户,所以可能有更好的方法。尝试DataOutputStream dos
并调用dos.writeDouble(double v)
,每读一次。祝你好运。我试过了,但没有成功:(也许以.npy格式编写bin文件可能会有所帮助。感谢您的帮助,写一些数字并进行比较。可能是这样的。npy不是简单的8字节二进制双精度,首先是高字节。另外,请尝试dos.writeLong(double.doubleToLongBits(double value))
@henri:如果您使用此方法,请尝试使用np.fromfile读取数据(“data.bin”,dtype='>f8')
。该dtype
参数告诉fromfile
浮点值存储在“big-endian”中“格式。我刚刚尝试了一个简单的例子,通过在fromfile
中使用参数dtype='>f8'
,这对我来说很有效。哇哦,'>f8'有效。非常感谢你们!我也非常感谢你们的帮助!”
np.fromfile('filename', np.float32).byteswap()