Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用“将float64转换为int64”;“安全”;_Python_Numpy_Casting_Floating Point_Int - Fatal编程技术网

Python 使用“将float64转换为int64”;“安全”;

Python 使用“将float64转换为int64”;“安全”;,python,numpy,casting,floating-point,int,Python,Numpy,Casting,Floating Point,Int,我想将NumPy(1.11.0版)数组从float64转换为int64。我希望这个操作能够在整数上完成,但在非整数上失败 我的理解是我可以使用casting=safe,尽管我的理解显然是错误的 我希望以下措施能够奏效: np.array([1.0]).astype(int, casting='safe') 这将失败: np.array([1.1]).astype(int, casting='safe') 但是,它们都会因以下错误而失败: ---------------------------

我想将NumPy(1.11.0版)数组从
float64
转换为
int64
。我希望这个操作能够在整数上完成,但在非整数上失败

我的理解是我可以使用
casting=safe
,尽管我的理解显然是错误的

我希望以下措施能够奏效:

np.array([1.0]).astype(int, casting='safe')
这将失败:

np.array([1.1]).astype(int, casting='safe')
但是,它们都会因以下错误而失败:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-51-7261ddf00794> in <module>()
    1 import numpy as np
    2 print(np.__version__)
----> 3 np.array([1.0]).astype(int, casting='safe')

TypeError: Cannot cast array from dtype('float64') to dtype('int64') according to the rule 'safe'
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
1作为np导入numpy
2份打印件(np.版本)
---->3 np.array([1.0]).astype(int,casting='safe')
TypeError:无法根据“安全”规则将数组从dtype('float64')强制转换为dtype('int64')

我猜我对安全铸造的含义有一个根本性的误解,所以这可能不是实现这一点的最佳方法,有没有更好的方法让第一个例子起作用,但第二个失败?

我不知道有什么方法可以直接在numpy中实现这一点。我能找到的将整数的浮点数据类型数组转换为int数据类型数组的最快方法是:

import numpy as np

def float_to_int(array):
    int_array = array.astype(int, casting='unsafe', copy=True)
    if not np.equal(array, int_array).all():
        raise TypeError("Cannot safely convert float array to int dtype. "
                        "Array must only contain whole numbers.")
    return int_array
正确性测试:

In [3]: whole_numbers = np.arange(1000000, dtype=float)

In [4]: fractional = np.arange(0, 100000, 0.1, dtype=float)

In [5]: float_to_int(whole_numbers)
Out[5]: array([     0,      1,      2, ..., 999997, 999998, 999999])

In [6]: float_to_int(fractional)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-0a7807a592b7> in <module>()
----> 1 float_to_int(fractional)

<ipython-input-2-953668ae0922> in float_to_int(array)
      2         int_array = array.astype(int, casting='unsafe', copy=True)
      3         if not np.equal(array, int_array).all():
----> 4                 raise TypeError("Cannot safely convert float array to int dtype. "
      5                                 "Array must only contain whole numbers.")
      6         return int_array

TypeError: Cannot safely convert float array to int dtype. Array must only contain whole numbers.
运行时比较:

In [8]: %timeit float_to_int(whole_numbers)
100 loops, best of 3: 2.75 ms per loop

In [9]: %timeit float_to_int_mod(whole_numbers)
100 loops, best of 3: 8.74 ms per loop
这在Python 3和numpy 1.11.0中进行了测试。

您几乎做到了:

In [7]: a = np.array([1.1, 2.2, 3.3])

In [8]: a.astype(int) == a
Out[8]: array([False, False, False], dtype=bool)

In [9]: if (a.astype(int) != a).any():
   ...:     raise ValueError("Conversion failed")
   ...: 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-3628e8ae2ce8> in <module>()
      1 if (a.astype(int) != a).any():
----> 2     raise ValueError("Conversion failed")
      3 

ValueError: Conversion failed

In [10]: b = np.array([1.0, 2.0, 3.0])

In [11]: b.astype(int) == b
Out[11]: array([ True,  True,  True], dtype=bool)
[7]中的
:a=np.array([1.1,2.2,3.3])
在[8]中:a.astype(int)==a
Out[8]:数组([False,False,False],dtype=bool)
在[9]中:如果(a.astype(int)!=a.any():
…:提升值错误(“转换失败”)
...: 
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1如果(a.astype(int)!=a).any():
---->2升值错误(“转换失败”)
3.
ValueError:转换失败
[10]中:b=np.array([1.0,2.0,3.0])
在[11]中:b.astype(int)==b
Out[11]:数组([True,True,True],dtype=bool)

“安全”与“不安全”强制转换仅指数据类型,而不是值。因此,是的,从float64到int64的转换是“不安全的”,因为至少存在一个不能无损转换为整数的浮点数。

我认为
安全
适用于没有信息丢失的转换。它不是一个关心值的操作,只关心类型。换句话说,
float
->
int
对于
float
的整个域不是一种安全的转换。但反过来应该是安全的。
In [7]: a = np.array([1.1, 2.2, 3.3])

In [8]: a.astype(int) == a
Out[8]: array([False, False, False], dtype=bool)

In [9]: if (a.astype(int) != a).any():
   ...:     raise ValueError("Conversion failed")
   ...: 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-3628e8ae2ce8> in <module>()
      1 if (a.astype(int) != a).any():
----> 2     raise ValueError("Conversion failed")
      3 

ValueError: Conversion failed

In [10]: b = np.array([1.0, 2.0, 3.0])

In [11]: b.astype(int) == b
Out[11]: array([ True,  True,  True], dtype=bool)