python 3 round on a numpy float意外地浮出水面

时间:2017-12-04 20:49:37

标签: python-3.x numpy types

我有一个np.array startIdx来自一个由整数和浮点字段组成的元组列表:

>>> startIdx, someInt, someFloat = np.array(resultList).T
>>> startIdx
array([0.0, 111.0, 333.0]) # 10 to a few 100 positive values of the order of 100 to 10000
>>> round(startIdx[2])
333.0 # oops
>>> help(round)
Round [...] returns an int when called with one argument, otherwise the same type as the number.
>>> round(np.pi)
3
>>> round(np.pi, 2) # the optional argument is the number of decimal digits
3.14
round([0.0, 111.0, 333.0][2]) # to test whether it's specific for numpy arrays.
333

浮动当前工作(作为numpy数组的索引)但产生警告:

 VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future

我可以通过在一个非常大的记录数组(带有一个int字段''startIdx'')中收集我的结果来避免从元组到数组的转换(以及int到float)。

我可以使用类似int(. + 0.1)的东西,这也很难看。 int(round(.))甚至int(.)会安全地产生正确的结果吗?

1 个答案:

答案 0 :(得分:1)

In [70]: startIdx=np.array([0.0, 111.0, 333.0])
In [71]: startIdx
Out[71]: array([   0.,  111.,  333.])

如果您需要整数数组,请使用astype

In [72]: startIdx.astype(int)
Out[72]: array([  0, 111, 333])

不是round

In [73]: np.round(startIdx)
Out[73]: array([   0.,  111.,  333.])

np.array(resultList)生成一个float dtype数组,因为有些值是float。 arr=np.array(resultList, dtype='i,i,f')应该生成一个带有整数和浮点字段的结构化数组,假设resultList确实是一个元组列表。

 startIdx = arr['f0']  
那么

应该是一个整数dtype数组。

我希望结构化数组的内存使用与浮点数的内存使用相同。