Numpy np.fromstring () не работает, как и ожидалось - PullRequest
0 голосов
/ 25 января 2019

Я сохранил массив в текстовом файле в виде строки, надеясь, что смогу преобразовать его обратно в массив при чтении из файла:

str_arr = "[0.01 0.01 0.01 0.01 0.01 0.01]"
num_arr = np.fromstring(str_arr,dtype = np.float64 ,count = 6,sep = ' ')

результат, который равен num_array:

array([-1.00000000e+000,  6.94819184e-310,  6.94819184e-310,
        6.94818751e-310,  6.94818751e-310,  6.94818751e-310])

Я ожидал массив 0.01 с

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Скорее всего, вы сохранили свой массив в файле, используя str .Это неверно.
Хотя в этом случае ошибка не видна, для больших массивов станет ясно, что значение, сохраненное таким образом, приведет к неправильному буферу.Проверьте [SO]: ValueError: слишком большая последовательность;не может быть больше 32 (ответ @ CristiFati) для получения более подробной информации.

Хотя существуют тривиальные способы обойти текущую ситуацию (дополнительная обработка существующей строки), они будут только обходными путями ( gainarii ), в то время как правильный способ (или, по крайней мере, один из них) для решения будет правильно сериализовать массив (используя [SciPy]: numpy.ndarray.tostring) при сохранении в файл.

>>> arr = np.array([0.01, 0.01, 0.01, 0.01, 0.01, 0.01])
>>> arr
array([0.01, 0.01, 0.01, 0.01, 0.01, 0.01])
>>>
>>> str_arr0 = str(arr)
>>> str_arr0
'[0.01 0.01 0.01 0.01 0.01 0.01]'
>>> str_arr1 = arr.tostring()
>>> str_arr1
b'{\x14\xaeG\xe1z\x84?{\x14\xaeG\xe1z\x84?{\x14\xaeG\xe1z\x84?{\x14\xaeG\xe1z\x84?{\x14\xaeG\xe1z\x84?{\x14\xaeG\xe1z\x84?'
>>>
>>> arr_final = np.fromstring(str_arr1, dtype=np.float64)
>>> arr_final
array([0.01, 0.01, 0.01, 0.01, 0.01, 0.01])
>>>
>>> arr_final_wrong = np.fromstring(str_arr0[1:-1], dtype=np.float64, count=6, sep= " ")
>>> arr_final_wrong
array([0.01, 0.01, 0.01, 0.01, 0.01, 0.01])
>>>
>>> arr = np.array([0.01, 0.01, 0.01, 0.01, 0.01, 0.01] * 10)
>>> # This time, str(arr) will produce an invalid result
...
>>> str(arr)
'[0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01\n 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01\n 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01\n 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01\n 0.01 0.01 0.01 0.01]'
0 голосов
/ 25 января 2019

Кажется, что np.fromstring не знает, как интерпретировать скобки. Вы можете решить это, удалив их перед вызовом функции:

a = "[0.01 0.01 0.01 0.01 0.01 0.01]"
num_arr = np.fromstring(a.strip('[]'), count = 6, sep = ' ')

array([0.01, 0.01, 0.01, 0.01, 0.01, 0.01])

Также обратите внимание, что dtype по умолчанию равно float, поэтому нет необходимости указывать его в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...