我正在启动一个大矩阵,该矩阵会转换为pandas的数据框,从而使pandas能够推断列的数据类型。
这些列被推断为float64,但随后我可以使用pandas to_numeric
函数将这些列向下转换为float32,而不会损失精度。
如果熊猫能够在不损失精度的情况下向下转换为float32,为什么它们不能有效地将其推断为float64?
a = np.matrix('0.1 0.2; 0.3 0.4')
a_df = pd.DataFrame(list(map(np.ravel, a)), dtype=None)
print(genotype_data_df.dtypes)
# the columns are float64
genotype_data_df = a_df.apply(pd.to_numeric, downcast='float')
# the columns are now float32
我假设以这种方式实现该库有潜在的技术或实践原因?如果是这样,我期望得到一个可以解释为什么会这样的答案。
答案 0 :(得分:0)
为什么熊猫无法有效地将列推断为int64
我尚不清楚对int64
的强制转换效率很低。这只是数字值的 default dtype
,避免了重复检查列中的冗余度,从而避免了重复检查列中的每个值所需的更高精度。列以分配适当的dtype
。
他们为什么不像integer
或float32
那样以这种方式实现它?因为如果列中的任何值超过该默认精度,则需要将整个列重铸为更高的精度,而为此,将需要检查列中的每个单个值。因此,从一开始就假设较高的精度,而不是检查每个值并重新铸造等,这样的冗余/昂贵的事情就会减少。
当然,这似乎不是“最佳”的选择,但是如果您无法为构造函数指定dtype
,则必须进行权衡。
它们能够被转换为int32而不会损失精度吗?
您对此有误。显然并没有损失精度,但是如果您检查genotype_data_df.dtypes
,您会发现它们没有被转换为较低的精度(整数),实际上它们仍然是float64
。 / p>
>> a = np.matrix('0.1 0.2; 0.3 0.4')
>> a_df = DF(list(map(np.ravel, a)), dtype=None)
>> genotype_data_df = a_df.apply(pd.to_numeric, downcast='integer')
>> genotype_data_df.dtypes
0 float64
1 float64
dtype: object