在NumPy中将2D浮点数数组转换为2D整数数组

369

如何将一个浮点型的NumPy数组转换为整型NumPy数组?

4个回答

477

使用astype方法。

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> x.astype(int)
array([[1, 2],
       [1, 2]])

36
请确保您的数组中没有 np.infnp.nan,因为它们会产生意想不到的结果。例如,np.array([np.inf]).astype(int) 的输出是 array([-9223372036854775808]) - Garrett
在我的电脑上,np.array([np.inf]).astype(int)np.array([-np.inf]).astype(int)np.array([np.nan]).astype(int)都返回相同的结果。为什么? - BallpointBen
1
@BallpointBen:naninf是浮点值,不能有意义地转换为整数。正如你之前的评论所指出的那样,会有令人惊讶的行为,我认为精确的行为并没有被很好地定义。如果你想将naninf映射到某些值,你需要自己做。 - BrenBarn
1
请注意,x.astype(int)[0][0]不是“int”类型。它是“numpy.int32”类型。 - chris
1
请注意,尽管这确实将数组转换为整数,但@fhtuft的答案可能会导致更少的意外。 - Nathan Musoke

78
一些控制舍入方式的numpy函数:rintfloortruncceil。根据你想要将浮点数舍入到整数的方式,向上、向下或四舍五入。
>>> x = np.array([[1.0,2.3],[1.3,2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> y = np.trunc(x)
>>> y
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> z = np.ceil(x)
>>> z
array([[ 1.,  3.],
       [ 2.,  3.]])
>>> t = np.floor(x)
>>> t
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> a = np.rint(x)
>>> a
array([[ 1.,  2.],
       [ 1.,  3.]])

要将其中一个转换为int或numpy中的其他类型,可以使用astype函数(由BrenBern回答):

a.astype(int)
array([[1, 2],
       [1, 3]])

>>> y.astype(int)
array([[1, 2],
       [1, 2]])

2
正是我所需要的。astype通常太泛泛而谈了,我认为它在执行intx - inty转换时可能更有用。当我想要进行float - int转换并能够选择舍入方式时,这是一个不错的功能。 - Bakuriu
15
那么将几乎为整数的值(例如7.99999)安全地转换为整数(例如8)的最简单方法是 np.rint(arr).astype(int) - endolith
有没有numpy中将其转换为uint8的方法? - Ryan
2
@Ryan astype(np.uint8) - chris
你能否也评论一下这些方法的运行时间? - Divyanshu Srivastava

19

您可以使用np.int_

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> np.int_(x)
array([[1, 2],
       [1, 2]])

18

如果您不确定输入将是一个NumPy数组,则可以使用asarray而不是astype,并将dtype = int作为参数:

>>> np.asarray([1,2,3,4], dtype=int)
array([1, 2, 3, 4])
如果输入数组已经具有正确的数据类型,asarray将避免进行数组复制,而astype则不会(除非您指定copy=False):
>>> a = np.array([1,2,3,4])
>>> a is np.asarray(a)  # no copy :)
True
>>> a is a.astype(int)  # copy :(
False
>>> a is a.astype(int, copy=False)  # no copy :)
True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接