我正试图使用仅一个数字作为精确数字执行线性回归的精确计算。没有numpy,它工作得很好,但numpy在大量项目中表现更好,这就是我需要使用numpy的原因。但问题是,当我为X轴构建矩阵时,我失去了十进制精度,如下图所示。
我该如何修复它?我的意思是,对矩阵变量只返回一个数字作为精确数字。
import numpy as np
import pandas as pd
dataset = [[17.3,71.7],[19.3,48.3],[19.5,88.3]]
df = pd.DataFrame({
'force': [item[0] for item in dataset],
'push_up':[item[1] for item in dataset]
})
df_x = np.array([item for item in df['force']],dtype=np.float16)
df_y = np.array([item for item in df['push_up']],dtype=np.float16)
print([np.round(item, decimals=1) for item in df['force']])
#check precision
#here is the issue! the return lose my 1 decimal point precision.
# notice !No matter if I use this printed array above.
# also tried using this array construction to reconvert to 1 decimal precision but no success
#print( [np.float16(np.format_float_positional(item, precision=1)) for item in df['force']] )
matrix = np.vstack([df_x, np.ones(len(df_x))]).T
print(matrix[0][0])
#this print "17.296875" that is totally different from 17.3
#print(matrix[2][0]) #uncomment this to see that the half precision is not lost at all
要控制concatenate
中的dtype
(以及所有'stack'),参数必须匹配:
In [274]: np.vstack([np.array([1,2,3], 'float16'), np.ones(3,'float16')])
Out[274]:
array([[1., 2., 3.],
[1., 1., 1.]], dtype=float16)
ones
默认dtype为float64
:
In [275]: np.vstack([np.array([1,2,3], 'float16'), np.ones(3)])
Out[275]:
array([[1., 2., 3.],
[1., 1., 1.]])
In [276]: _.dtype
Out[276]: dtype('float64')
但是正如评论中所指出的,使用float16
只是表面上的舍入。
In [278]: np.vstack([np.array([1.234235,2.9999,3], 'float16'), np.ones(3,'float16')])
Out[278]:
array([[1.234, 3. , 3. ],
[1. , 1. , 1. ]], dtype=float16)
转置不改变值或dtype。