Python - простой NumPy массив не показывает ожидаемые значения - PullRequest
1 голос
/ 19 февраля 2020

Python newb ie здесь.

Я думаю, что написал довольно простой код для извлечения ТОЛЬКО чисел из полученной строки.

Похоже, что работает, КРОМЕ I я пытаюсь сохранить полученные номера в массиве NumPy для дальнейшей обработки, но вместо этого я вижу только «дурацкие» числа.

import numpy as np
#import array
apiString = " 'open': 1.082865 'close': 1.08287 'min': 1.08266 'max': 1.08295 'volume': 888"
np_Myarr01 = np.empty([1,5], dtype=float)

def Find_numbers():
    for word in apiString.split():
        try:
            thisNumber=float(word)
            print ("Found", thisNumber)
            Store_number(thisNumber)
        except ValueError:
            pass
    return

def Store_number(thisNumber):
    np.append(np_Myarr01, thisNumber)
    print("store " + str(thisNumber))
    return


# START OF MAIN PROGRAM

Find_numbers()
print (np_Myarr01)

*** OUTPUT ********** *********

Found 1.082865
store 1.082865
Found 1.08287
store 1.08287
Found 1.08266
store 1.08266
Found 1.08295
store 1.08295
Found 888.0
store 888.0
[[  2.17306514e-316   0.00000000e+000   6.92674292e-310   6.92674292e-310
    2.37151510e-322]]

Я надеялся, что массив прочитает

[[ 1.082865  1.08287  1.08266  1.08295  888.0]]

Любая помощь будет с благодарностью. Спасибо!

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы можете использовать смесь str.split() и re.search для извлечения чисел из вашего apiString:

Это:

apiString = " 'open': 1.082865 'close': 1.08287 'min': 1.08266 'max': 1.08295 'volume': 888"

my_array = np.array([float(x) for x in apiString.split() if not re.search('[a-zA-Z]', x)])

даст:

array([  1.082865,   1.08287 ,   1.08266 ,   1.08295 , 888.      ])

Подробности:

1) apiString.split() разделит вашу строку на список строк, где в исходной строке есть пробелы

2) re.search('[a-zA-Z]', x) вернет True если строка, хранящаяся в x, содержит заглавную или строчную букву (т. е. не число) (также, почему мы используем not здесь)

3) float(x) преобразует строку '1.808' в тип поплавок

0 голосов
/ 19 февраля 2020

В дополнение к комментариям @ barmar, если ваша строка API всегда выглядит так, как показано в примере, вы можете извлечь любой другой элемент после разбиения (с нарезкой) и позволить NumPy обработать остальную часть преобразования:

np_Myarr01 = np.fromiter(apiString.split()[1::2], float)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...