Я работаю над утилитой python для получения данных из каталога звезд Tycho. Одна из функций, которые я работаю над запросами каталога и возвращает всю информацию для данного идентификатора звезды (или набора звездных идентификаторов).создать многоуровневый структурированный массив из списка строк
В настоящее время я делаю это, перейдя через строки файла каталога, а затем попытаюсь разобрать строку в многоуровневый структурированный массив, если он был запрошен. (обратите внимание, если есть лучший способ сделать это, вы можете сообщить мне, хотя это не то, о чем этот вопрос, - я делаю это так, потому что каталог слишком велик, чтобы загружать все это в память на одном время)
В любом случае, как только я определил запись, которую хочу сохранить, я столкнулся с проблемой ... Я не могу понять, как ее разобрать в структурированный массив.
Например, говорят, что запись, которую я хочу, чтобы это:
record = '0002 00038 1| | 3.64121230| 1.08701186| 14.1| -23.0| 69| 82| 1.8| 1.9|1968.56|1957.30| 3|1.0|3.0|0.9|3.0|12.444|0.213|11.907|0.189|999| | | 3.64117944| 1.08706861|1.83|1.73| 81.0|104.7| | 0.0'
Теперь я пытаюсь разобрать это в Numpy структурированный массив с DTYPE:
dform = [('starid', [('TYC1', int), ('TYC2', int), ('TYC3', int)]),
('pflag', str),
('starBearing', [('rightAscension', float), ('declination', float)]),
('properMotion', [('rightAscension', float), ('declination', float)]),
('uncertainty', [('rightAscension', int), ('declination', int), ('pmRA', float), ('pmDc', float)]),
('meanEpoch', [('rightAscension', float), ('declination', float)]),
('numPos', int),
('fitGoodness', [('rightAscension', float), ('declination', float), ('pmRA', float), ('pmDc', float)]),
('magnitude', [('BT', [('mag', float), ('err', float)]), ('VT', [('mag', float), ('err', float)])]),
('starProximity', int),
('tycho1flag', str),
('hipparcosNumber', str),
('observedPos', [('rightAscension', float), ('declination', float)]),
('observedEpoch', [('rightAscension', float), ('declination', float)]),
('observedError', [('rightAscension', float), ('declination', float)]),
('solutionType', str),
('correlation', float)]
Это кажется, что должна быть довольно простая вещь, чтобы сделать, но все, что я стараюсь брейки ...
Я пробовал:
np.genfromtxt(BytesIO(record.encode()),dtype=dform,delimiter=(' ','|'))
np.genfromtxt(BytesIO(record.encode()),dtype=dform,delimiter=(' ','|'),missing_values=' ',filling_values=None)
оба из которых дает мне
{TypeError}cannot perform accumulate with flexible type
, который не имеет никакого смысла, так как не следует делать какие-либо накопления.
Я также попытался
np.array(re.split('\|| ',record),dtype=dform)
, который жалуется на
{TypeError}a bytes-like object is required, not 'str'
и другой вариант
np.array([x.encode() for x in re.split('\|| ',record)],dtype=dform)
который не выбрасывает ошибку, но и, конечно, не возвращает правильные результаты:
[ ((842018864, 0, 0), '', (0.0, 0.0), (0.0, 0.0), (0, 0, 0.0, 0.0), (0.0, 0.0), 0, (0.0, 0.0, 0.0, 0.0), ((0.0, 0.0), (0.0, 0.0)), 0, '', '', (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), '', 0.0)...
Так как я могу это сделать? Я думаю, что вариант genfromtxt - это путь (особенно потому, что иногда могут отсутствовать данные), но я не понимаю, почему он не работает. Это что-то, что мне просто нужно будет написать парсер самостоятельно?
Хмм ... ваша 'запись' имеет 32 поля, но' dform', похоже, имеет '17'. Как так? Я мог представить, что это работает иначе: np.genfromtxt (BytesIO (record.encode()), dtype = dform, delimiter = '|') ', но в любом случае теперь кажется двусмысленным. –
, так как для меня не достаточно, чтобы воссоздать проблему, попробуйте переключить свою 'str' на' np.str_' – TriHard8