Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用numpy.fromfile读取Python中ObjectOutputStream用Java编写的二进制双精度文件_Java_Python_Numpy - Fatal编程技术网

使用numpy.fromfile读取Python中ObjectOutputStream用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 {

我已经使用Java中ObjectOutputStream的writeDouble()函数将二进制格式的double数组写入了一个文件。当我尝试使用numpy.fromfile在Python上读取此文件时,它不会给出相同的值。当我尝试使用seek()进行位移动时,它仍然没有帮助

如果我对32位int执行相同的过程,它是有效的,但是我总是需要使用seek()迭代文件的开头部分,因为我无法区分它是胡言乱语

相关Java代码:

//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()