Странное поведение файла ndarray.tofile

Я перехожу к Matlab в NumPy / SciPy, и кажется, что np.fromfile и ndarray.tofile corresopnds для fread и fwrite в Matlab соответственно.

Чтобы проверить эти API, я сначала создал двоичный файл, содержащий пять целых чисел {1, 2, 3, 4, 5} в двоичном формате 'int32'.

Затем я прочитал этот файл, используя np.fromfile.

In [365]: in_file = open('12345.bin', 'rb'); x = np.fromfile(in_file, 'int32'); in_file.close() 

Я проверил, что он был успешно прочитан, как показано ниже:

 In [367]: x Out[366]: array([1, 2, 3, 4, 5], dtype=int32) 

Теперь я написал это как файл с другим именем. Мое ожидание заключается в том, что этот выходной файл должен быть точно таким же, как исходный входной файл, который является «12345.bin».

 In [368]: out_file = open('12345out.bin', 'wb'); x.tofile(out_file, 'int32'); out_file.close() 

Но одна удивительная вещь – размер «12345out.bin» составляет 25 байт, а «12345.bin» – 20 байт. Так что что-то не так. Я открыл «12345out.bin» следующим образом:

 In [369]: in_file = open('12345out.bin', 'rb'); x2 = np.fromfile(in_file, 'int32'); in_file.close() In [370]: x2 Out[370]: array([1953392945, 1764897331, 842232942, 1953392947, 1765028403, 842232942], dtype=int32) 

Итак, из приведенного выше результата мы видим, что что-то совершенно неверно. Коуд, пожалуйста, помогите мне, что я делаю неправильно?

tofile не нуждается в параметре type (что является одной из причин, по которым это не отличный инструмент, поскольку он не сохраняет информацию о типе). Поэтому, когда вы делаете

 x.tofile(out_file, 'int32') 

вы на самом деле говорите, что хотите использовать строку "int32" в качестве разделителя в текстовом формате:

 >>> x = np.arange(1,6,dtype=np.int32) >>> x.tofile(open("tmp.dat", "wb"), "int32") >>> open("tmp.dat","rb").read() b'1int322int323int324int325' 

Вместо:

 >>> x = np.arange(1,6,dtype=np.int32) >>> x.tofile(open("tmp.dat", "wb")) >>> open("tmp.dat","rb").read() b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00' >>> np.fromfile("tmp.dat", "int32") array([1, 2, 3, 4, 5]) 

(Обратите внимание, что я был слишком ленив, чтобы использовать блок с открытием и закрытием файлов, как я должен.)