2013-07-17 2 views
2

У меня есть двоичный файл, который я могу открыть в MATLAB, но не могу открыть его в Python. Двоичный файл кодируется как «двойной поплавок,» таким образом прочитан MATLAB с помощью следующей строки:Эквивалент файла Matlab fread() 'float64' в Python

fread(fopen(fileName), 'float64'); 

В Python, я не совсем уверен, как повторить эту строку. Я подумал, что использование Numpy было бы хорошим местом для начала, поэтому я попробовал следующие строки, но не получил ожидаемый результат. В каждой строке есть 6 номеров, у меня есть только первый и один «NaN».

from numpy import * 
f = open('filename', 'rb') 
a = fromfile(f, double64, 10) 
print a 

Любая помощь по этому вопросу была бы чрезвычайно оценена; Я опубликовал как двоичные, так и анализируемые файлы MATLAB в комментариях ниже. Мне тоже не нужно использовать Numpy, я открыт для любого решения на основе Python. Спасибо.

+1

«Есть 6 номеров в каждой строке» - «строка»? Являются ли они кодированными ASCII или IEEE-float закодированными? –

+1

Ссылка на файл данных: https://www.dropbox.com/s/2mggkyyzlpcrs31/TEMPO3.2F-0215_s00116.dat – Anish

+1

Ссылка на анализируемый файл MATLAB: https://www.dropbox.com/s/nk8mm40uovgeixu/ TEMPO3.2F-0215_s00116.csv – Anish

ответ

6

Каждое второе значение nan так что это может быть какой-то ограничитель. Кроме того, значения в файле являются столбцами. Следующий скрипт считывает данные, отбрасывает запись NaN, манипулирует массив в правильную форму, и выводит CSV-файл, который идентичен тому, который разместил:

import csv 
import numpy as np 

# Pull in all the raw data. 
with open('TEMPO3.2F-0215_s00116.dat', 'rb') as f: 
    raw = np.fromfile(f, np.float64) 

# Throw away the nan entries. 
raw = raw[1::2] 

# Check its a multiple of six so we can reshape it. 
if raw.size % 6: 
    raise ValueError("Data size not multiple of six.") 

# Reshape and take the transpose to manipulate it into the 
# same shape as your CSV. The conversion to integer is also 
# so the CSV file is the same. 
data = raw.reshape((6, raw.size/6)).T.astype('int') 

# Dump it out to a CSV. 
with open('test.csv', 'w') as f: 
    w = csv.writer(f) 
    w.writerows(data) 

Edit: обновление версии изменения, предложенные jorgeca:

import csv 
import numpy as np 

# Pull in all the raw data. 
raw = np.fromfile('TEMPO3.2F-0215_s00116.dat', np.float64) 

# Throw away the nan entries. 
raw = raw[1::2] 

# Reshape and take the transpose to manipulate it into the 
# same shape as your CSV. The conversion to integer is also 
# so the CSV file is the same. 
data = raw.reshape((6, -1)).T.astype('int') 

# Dump it out to a CSV. 
with open('test.csv', 'w') as f: 
    w = csv.writer(f) 
    w.writerows(data) 
+0

Чтобы добавить путаницу ко всем, кто поддерживает ваш код, вы всегда можете прочитать данные как 'complex128', а затем вызвать' np.imag() 'взять значения из мнимых частей ... – Blair

+0

... и нет, это не было серьезным предложением: P. – Blair

+1

Хороший ответ! Несколько комментариев, которые вы, вероятно, знаете, но я думаю, интересны: 'np.fromfile' принимает имя файла, поэтому вам не нужно обертывать его в блок' with ... '; '.reshape' вызывает значение ValueError, если он не может этого сделать, поэтому в духе [EAFP] (http://docs.python.org/2/glossary.html#term-eafp) проверка ошибки может быть удалена (в любом случае это не удастся); '.reshape' принимает -1 как размер« wild card ». – jorgeca

4

Существует разделителем между вашими значениями данных, продуцирующих чередующиеся данные и NaN на чтение, например, в MATLAB:

NaN 
2134 
NaN 
2129 
NaN 
2128 
.... 
1678 

и NumPy:

[ nan 2134. nan ..., 1681. nan 1678.] 

я получаю тот же вход, используя код, который вы отправили либо с помощью Matlab, либо с помощью numpy (1.7). Обратите внимание, что данные считываются из файла dat-файла по столбцу, а не по строкам в соответствии с шаблоном в вашем файле csv.

Чтобы получить все данные в NumPy попробовать

a = fromfile(file=f, dtype=float64, count=-1) 
Смежные вопросы