Я хотел бы создать массив из списка, но сохранить NaN и инфы - PullRequest
4 голосов
/ 14 мая 2011

Я анализирую файл данных, который содержит текст с пробелами, который был сгенерирован из c ++. Некоторые из движущих вычислений будут переполнены, недостаточны или генерируют NaN. Похоже, что строки «1. # INF00» и «1. # IND00» не перевариваются с помощью numpy.array (), возвращая ошибку «недопустимый литерал для float ()». Я попытался сделать замену так:

line = line.replace('1.#INF00','inf')
line = line.replace('1.#IND00','ind')
vals = line.split(' ')
myarray = array(vals)

но увы, безрезультатно. Я также пробовал «нан» и «NaN». Есть ли какая-нибудь строка, которую я мог бы заменить, которая float () будет интерпретировать в nan, inf и т. Д.? Возможно, мне нужно уйти в некоторых цитатах?

Кроме того, можете ли вы сказать мне, как matplotlib будет обрабатывать inf? Решение по умолчанию было бы изменить их на NaN, когда они обнаружены. Я обнаружил, что он продемонстрировал , что matplotlib будет обрабатывать их корректно, оставляя пробелы в данных. Который был бы приемлемым лечением для моих "инф" и "инд"

Ответы [ 2 ]

4 голосов
/ 14 мая 2011

float('nan') должен возвращать NaN, а float('inf') должен возвращать бесконечность.По крайней мере, так работает мой переводчик (CPython 2.7).Кажется, что на некоторых платформах (особенно на Windows) все было по-другому в CPython 2.5, но я сомневаюсь, что вы используете такую ​​старую версию Python.

Возможно, проблема в numpy, но в этом случаеВы можете попробовать:

line = line.replace('1.#INF00','inf')
line = line.replace('1.#IND00','nan')
vals = line.split(' ')
myarray = array([float(x) for x in vals])
1 голос
/ 15 мая 2011

Кроме того, вы можете просто позвонить numpy.genfromtxt и использовать missing_values kwarg.

например. с этими данными, сохраненными как data.txt:

1 0.2 0.3 1.#INF00
2 0.5 0.6 0.7
3 1.#IND00 0.1 0.2
4 0.4 0.4 0.5
5 0.5 0.5 0.7

Вы можете просто сделать что-то подобное (нам нужно установить для идентификатора комментария что-то отличное от "#" по умолчанию, в данном конкретном случае):

import numpy as np
data = np.genfromtxt('data.txt', missing_values=['1.#INF00', '1.#IND00'],
                      comments='somethingelse')

Это дает:

array([[ 1. ,  0.2,  0.3,  nan],
       [ 2. ,  0.5,  0.6,  0.7],
       [ 3. ,  nan,  0.1,  0.2],
       [ 4. ,  0.4,  0.4,  0.5],
       [ 5. ,  0.5,  0.5,  0.7]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...