将Numpy中的浮点数取整为整数

12

我有一个浮点数数组,我想将它们取整到最近的整数,这样我就可以将它们用作索引。

例如:

In [2]: import numpy as np

In [3]: arr = np.random.rand(1, 10) * 10

In [4]: arr
Out[4]:
array([[4.97896461, 0.21473121, 0.13323678, 3.40534157, 5.08995577,
        6.7924586 , 1.82584208, 6.73890807, 2.45590354, 9.85600841]])

In [5]: arr = np.floor(arr)

In [6]: arr
Out[6]: array([[4., 0., 0., 3., 5., 6., 1., 6., 2., 9.]])

In [7]: arr.dtype
Out[7]: dtype('float64')

在向下取整之后它们仍然是浮点数,是否有一种自动将它们转换为整数的方法?

3个回答

14

我用@DanielF的解释编辑了答案:

"floor不会将数字转换为整数,它只会返回整数值的浮点数,因此您仍需要使用astype将其转换为整数"

检查以下代码以理解解决方案:

import numpy as np
arr = np.random.rand(1, 10) * 10
print(arr)
arr = np.floor(arr).astype(int)
print(arr)
OUTPUT:
[[2.76753828 8.84095843 2.5537759  5.65017407 7.77493733 6.47403036
  7.72582766 5.03525625 9.75819442 9.10578944]]
[[2 8 2 5 7 6 7 5 9 9]]

2
尝试并给出一些解释,而不仅仅是代码。即使只是从“floor不会转换为整数,它只会给出整数值的float,因此您仍需要使用astype来更改为int”开始,也可以避免审核队列的干扰。 - Daniel F

1

作为整除后更改类型的替代方案,您可以为所需数据类型提供一个输出数组给np.floor (以及任何其他numpy ufunc)。例如,假设您想将输出转换为np.int32 ,则执行以下操作:

import numpy as np
arr = np.random.rand(1, 10) * 10
out = np.empty_like(arr, dtype=np.int32)
np.floor(arr, out=out, casting='unsafe')

正如转换参数已经表明的那样,当将输出转换为不同类型时,您应该知道自己在做什么。但是,在您的情况下,这并不是真正的不安全。

虽然如此,我不会在您的情况下调用np.floor,因为所有值都大于零。因此,解决您问题的最简单且可能最快的方法是直接转换为整数。

import numpy as np
arr = (np.random.rand(1, 10) * 10).astype(int)

1
为什么不直接使用以下代码:

np.random.randint(1,10)


1
这对我来说已经足够接近答案了,所以我不会标记它,但是一旦您获得了那些特权,这可能应该成为一个评论。它并没有真正回答问题,但可以作为一种平行解决方案。 - Daniel F
这里的参数110np.random.rand(1, 10)中的那些参数具有非常不同的含义:在那里,这些参数是生成数组的形状;而在这里,您正在请求单个结果,而110则给出了边界。并不清楚OP是否希望在1到10的范围内得到整数。(我已在评论中要求澄清。) - Mark Dickinson
@DanielF 是的,这应该是一条评论,但我无法评论,因为我还没有解锁它。 - vegiv
@MarkDickinson 如果您使用size参数,您可以获得一个带有大小的数组(例如:randint的参数(low = 0,high = 10,size = 10)),由于他想将它们用作索引,我猜他想要的是整数。但我同意他可以具体说明。 - vegiv

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