2015-11-07 2 views
0

Как я могу прочитать и сохранить массив 8D в Python из файла .dat? Мой двоичный файл выглядит так. Я хочу, чтобы каждая строка будет строкаЗагрузить .dat и .npy в Python

['r 11 1602 24 1622 0\n', 'i 26 1602 36 1631 0\n', 
'v 37 1602 57 1621 0\n', 'e 59 1602 76 1622 0\n', 
'r 77 1602 91 1622 1\n', 'h 106 1602 127 1631 0\n', 
'e 127 1602 144 1622 1\n', 'h 160 1602 181 1631 0\n', 
'e 181 1602 198 1622 0\n', 'a 200 1602 218 1622 0\n', 
'r 218 1602 232 1622 0\n', 'd 234 1602 254 1631 1\n', 
't 268 1602 280 1627 0\n', 'h 280 1602 301 1631 0\n', 
'e 302 1602 319 1622 1\n', 'd 335 1602 355 1631 0\n'] 

Когда я попытался это:

file1 = open('data/train1.dat', 'rb') 
train1_dat = np.loadtxt(file1.readlines(), delimiter=',') 
print train1_dat 

Я получил эту ошибку

ValueError: could not convert string to float: r 11 1602 24 1622 0 
+0

Что такое .dat формат? И не можете ли вы использовать ['np.load'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html) для массива numpy? – agold

+0

['r 11 1602 24 1622 0 \ n', 'i 26 1602 36 1631 0 \ n', 'v 37 1602 57 1621 0 \ n', 'e 59 1602 76 1622 0 \ n', 'r 77 1602 91 1622 1 \ n ',' h 106 1602 127 1631 0 \ n ',' e 127 1602 144 1622 1 \ n ',' h 160 1602 181 1631 0 \ n ',' e 181 1602 198 1622 0 \ n ' , a 200 1602 218 1622 0 \ n ',' r 218 1602 232 1622 0 \ n ',' d 234 1602 254 1631 1 \ n ',' t 268 1602 280 1627 0 \ n ',' h 280 1602 301 1631 0 \ n ',' e 302 1602 319 1622 1 \ n ',' d 335 1602 355 1631 0 \ n ',] Это мой формат .dat. И я хочу сохранить его в массив 6d. –

+0

Похоже, ваши данные загружаются штрафом. Где вы покрываете свою линию плавающей точкой? –

ответ

1

Предполагая, что ваш файл .dat точно так, как в вашем вопросе, мы сначала создаем строку данных, имитирующую этот формат. Мы читаем в строку данных, а затем munge его в формат, подходящий для загрузки в NumPy

from StringIO import StringIO 

d = StringIO("""['r 11 1602 24 1622 0\n', 'i 26 1602 36 1631 0\n', 
'v 37 1602 57 1621 0\n', 'e 59 1602 76 1622 0\n', 
'r 77 1602 91 1622 1\n', 'h 106 1602 127 1631 0\n', 
'e 127 1602 144 1622 1\n', 'h 160 1602 181 1631 0\n', 
'e 181 1602 198 1622 0\n', 'a 200 1602 218 1622 0\n', 
'r 218 1602 232 1622 0\n', 'd 234 1602 254 1631 1\n', 
't 268 1602 280 1627 0\n', 'h 280 1602 301 1631 0\n', 
'e 302 1602 319 1622 1\n', 'd 335 1602 355 1631 0\n'] """) 

data = d.read() # read contents of .dat file 
data = data.strip() # remove trailing newline 
data = data.replace('\n', '') # remove all newlines 
data = data.replace("', '", "','") # clean up separators 
data = data[2:-2] # remove leading and trailing delimiters 
data = data.split("','") # convert into a clean list 
data = '\n'.join(data) # re-combine into a string to load into numpy 

print(data) # have a look at the new string format 

В результате .dat строка выглядит следующим образом:

r 11 1602 24 1622 0 
i 26 1602 36 1631 0 
v 37 1602 57 1621 0 
e 59 1602 76 1622 0 
r 77 1602 91 1622 1 
h 106 1602 127 1631 0 
e 127 1602 144 1622 1 
h 160 1602 181 1631 0 
e 181 1602 198 1622 0 
a 200 1602 218 1622 0 
r 218 1602 232 1622 0 
d 234 1602 254 1631 1 
t 268 1602 280 1627 0 
h 280 1602 301 1631 0 
e 302 1602 319 1622 1 
d 335 1602 355 1631 0 

Глупый сноска: Я нахожу это интригующий что первая колонка кажется акростимом: «река, которую он услышал ...», а 1 в последнем столбце обозначает конец каждого слова :-), в любом случае, ни один из моих дел.

Более серьезно, если бы вы могли договориться о том, что ваш .dat-файл в этом формате с самого начала, то все вышеприведенные шаги были бы лишними. Теперь мы готовы импортировать легко в Numpy массив:

import numpy as np 

d = StringIO(data) 
# The column names 'a' to 'f' are arbitrary 
# and can be changed to suit 
# also the numbers are all arbitrarily imported as floats 
data = np.loadtxt(d, dtype={'names': ('a', 'b', 'c', 'd', 'e', 'f'), 
          'formats': ('S1', 'f', 'f', 'f', 'f', 'f')}) 
print(data) 

Вот результат:

[('r', 11.0, 1602.0, 24.0, 1622.0, 0.0) 
('i', 26.0, 1602.0, 36.0, 1631.0, 0.0) 
('v', 37.0, 1602.0, 57.0, 1621.0, 0.0) 
('e', 59.0, 1602.0, 76.0, 1622.0, 0.0) 
('r', 77.0, 1602.0, 91.0, 1622.0, 1.0) 
('h', 106.0, 1602.0, 127.0, 1631.0, 0.0) 
('e', 127.0, 1602.0, 144.0, 1622.0, 1.0) 
('h', 160.0, 1602.0, 181.0, 1631.0, 0.0) 
('e', 181.0, 1602.0, 198.0, 1622.0, 0.0) 
('a', 200.0, 1602.0, 218.0, 1622.0, 0.0) 
('r', 218.0, 1602.0, 232.0, 1622.0, 0.0) 
('d', 234.0, 1602.0, 254.0, 1631.0, 1.0) 
('t', 268.0, 1602.0, 280.0, 1627.0, 0.0) 
('h', 280.0, 1602.0, 301.0, 1631.0, 0.0) 
('e', 302.0, 1602.0, 319.0, 1622.0, 1.0) 
('d', 335.0, 1602.0, 355.0, 1631.0, 0.0)] 
Смежные вопросы