按列截断浮动的Numpy recarray索引

时间:2016-07-14 19:17:28

标签: python numpy

在python中的一个简单的重新排列中,当按列名索引时,输出值会被截断:

var list = data.Where(!t.Area.HasValue || t => t.Area == response.Area).Select(t => new Status()
{
   PK = t.PK,
   Area = t.Area,
   Description = t.Area.HasValue ? a : b
   //other stuff
}).ToList();

为什么会这样?我可以使用列索引获取完整的非截断值吗?

2 个答案:

答案 0 :(得分:1)

数字数组的打印精度为8位数:

In [250]: np.get_printoptions()
Out[250]: 
{'edgeitems': 3,
 'formatter': None,
 'infstr': 'inf',
 'linewidth': 75,
 'nanstr': 'nan',
 'precision': 8,
 'suppress': False,
 'threshold': 1000}

但是在显示重新排列或其记录时它不会使用该值。您可能还会看到带有标量值的较长打印件:

print arr['a'].item()

==============

In [252]: arr = np.zeros(1, dtype=[('a', np.float)])
     ...: arr[0]['a'] = 0.1234567891234
     ...: 

In [253]: arr
Out[253]: 
array([(0.1234567891234,)], 
      dtype=[('a', '<f8')])

In [254]: arr[0]
Out[254]: (0.1234567891234,)

In [255]: arr['a']
Out[255]: array([ 0.12345679])

In [256]: arr['a'].item()
Out[256]: 0.1234567891234

In [257]: arr['a'][0]
Out[257]: 0.1234567891234

==================

https://github.com/numpy/numpy/issues/5463

array2string handles floats differently for structured array and ndarray 触及这一点。结构化数组记录中的数字格式不遵循print options

答案 1 :(得分:0)

正如其他人所说,这是印刷精度的问题。您可以使用set_printoptions

设置不同的值
import numpy
numpy.set_printoptions(precision=20)
arr = numpy.zeros(1, dtype=[('a', numpy.float)])
arr[0]['a'] = 0.1234567891234
print arr
print arr['a']

> [(0.1234567891234,)]
> [ 0.12345678912339999589]