Numpy在一个数字的末尾削减了零

时间:2015-11-07 01:28:32

标签: python arrays numpy

对于那些更熟悉python列表和numpy数组的人: 我注意到当python列表(浮点数)被转换为numpy数组时,会删除尾随的重要零。一个简单的代码说明了:

import numpy as np

# python list
list = [1.20780,4.6340]

# convert to numpy array
arr = np.asfarray(list)

print(arr) 
[ 1.2078  4.634 ]

你知道为什么numpy会删除尾随的零吗?知道怎么强迫numpy保持零?

2 个答案:

答案 0 :(得分:2)

在数学中,1.2078等于1.20780。 打印方法print将您的数组定义为预定义类型float64

如果要打印5位数字,可以转换为字符串:

In[24]: print ['%.5f'%i for i in arr]
['1.20780', '4.63400']

您还可以使用dtype来查看编码#bits对内存中图形表示的影响:

In[26]: arr.astype('float16')
Out[26]: array([ 1.20800781,  4.6328125 ], dtype=float16)
In[27]: arr.astype('float32')
Out[27]: array([ 1.20780003,  4.63399982], dtype=float32)
In[28]: arr.astype('float64')
Out[28]: array([ 1.2078,  4.634 ])
In[29]: arr.astype('int')
Out[29]: array([1, 4])
In[30]: arr.astype('int8')
Out[30]: array([1, 4], dtype=int8)
In[31]: arr.astype('float')
Out[31]: array([ 1.2078,  4.634 ])
In[32]: arr.astype('float5')

答案 1 :(得分:0)

如果从Python打印列表,您会发现尾随的零也丢失了:

>>> list = [1.20780,4.6340]
>>> list
[1.2078, 4.634]

基本原因是,对于硬件和运行时系统,它们重要。它们不会影响float的数值。它们不会影响数字处理,因为硬件在进行计算时不会注意有效数字",而不是数据类型的自然精度。没有考虑误差范围。

您对数值有什么影响?

我明白了。是的,你可以这样做......但保留文件名的原始文本。将其转换为数字值后,尾随零将无法恢复。您将无法区分1.29780与1.2978或1.297800000000

更好的是,对提取的浮点值进行排序,正如我在下面所做的那样。该单行命令执行以下操作

  • 在连字符处拆分名称。
  • 提取该拆分中的第二项
  • 将其用作对项目进行排序的值
  • 将此值提取作为排序功能的键。
  • 对列表进行排序。

    file_list = [     " NEW-2.3087-QA&#34 ;,     " NEW-16.8888-HX&#34 ;,     " NEW-1.20780-BC&#34 ;,     " OLD-9.678900-NO"     ]

    order_list = sorted(file_list,key = lambda name:float((name.split(' - '))[1]))

    打印(order_list)

...和输出:

["NEW-1.20780-BC", "NEW-2.3087-QA", "OLD-9.678900-NO", "NEW-16.8888-HX"]

这样做你需要的吗?你有没有两个文件具有相同的数值,但有不同的表示形式,例如" A-1.0-Z"和" B-1.000-ST" ?