使用numpy.fromfile在Python中使用ObjectOutputStream读取用Java编写的双精度二进制文件

时间:2015-09-27 07:14:42

标签: java python numpy

我使用Java中的ObjectOutputStream的writeDouble()函数将二进制格式的双精度数组写入文件。当我尝试使用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);
  } 

相关的Python代码:

datafile1 = open("data.bin", "rb")      
data = np.fromfile(datafile1, dtype=np.float64, count=-1, sep='')  

print data

2 个答案:

答案 0 :(得分:1)

几乎相同,但现在没有元数据添加到文件中:

OutputStream os = new FileOutputStream("data.bin");
DataOutputStream dos = new DataOutputStream( os );
for (int i = 1; i <= 10; i++) {
    dos.writeDouble(arr[i]);
} 

答案 1 :(得分:0)

我知道已经有几年了。为了后代,这是我如何将其与$params = [ 'index' => 'mytestindex', 'body' => [ 'analyzer' => 'my_search_analyzer', 'text' => 'текст проверить чтобы' ], ]; $x = $this->obj->indices()->analyze($params); 一起使用的。

根据https://stackoverflow.com/a/27681630DataOutputStream.writeFloat()用Big Endian书写。 Numpy显然希望二进制文件以Little Endian编写,这与之相反。解决方案是对接收到的数组执行DataOutputStream

byteswap()

在使用np.fromfile('filename', np.float32).byteswap() 时,我怀疑您需要将double作为第二个参数传递。如果这不起作用,则是numpy的np.float64 s的完整列表:

https://docs.scipy.org/doc/numpy/user/basics.types.html