Numpy np.fromstring() 没有按预期工作

sea*_*ull 5 python numpy type-conversion

我已将一个数组作为字符串保存在文本文件中,希望在从文件读取时能够将其转换回数组:

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 = ' ')
Run Code Online (Sandbox Code Playgroud)

结果是num_array:

array([-1.00000000e+000,  6.94819184e-310,  6.94819184e-310,
        6.94818751e-310,  6.94818751e-310,  6.94818751e-310])
Run Code Online (Sandbox Code Playgroud)

我期待着一系列0.01s

Cri*_*ati 3

最有可能的是,您使用str将数组保存在文件中。那是错误的。
尽管在这种情况下,错误不可见,但对于较大的数组,很明显以这种方式保存的值将产生不正确的缓冲区。检查[SO]:ValueError:序列太大;不能大于 32(@CristiFati 的回答)了解更多详细信息。

尽管有一些简单的方法可以解决当前情况(对现有字符串进行额外处理),但它们只是解决方法(gainarii),而解决问题的正确方法(或至少其中之一)是正确序列化将其保存到文件时的数组 (使用[SciPy.Docs]: 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]'
Run Code Online (Sandbox Code Playgroud)