Предполагая, что ваш файл .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)]
Что такое .dat формат? И не можете ли вы использовать ['np.load'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html) для массива numpy? – agold
['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. –
Похоже, ваши данные загружаются штрафом. Где вы покрываете свою линию плавающей точкой? –