我有一些整数存储在np.float64
数组和标量中,我想将其转换为原生Python int
。
这是我的尝试:
import numpy as np
a = np.array([1, 2, 3], dtype=np.float64)
b = np.float64(4)
def float_to_int(x):
x_object = x.astype(object)
return np.floor(x_object)
# Array inputs are converted to int
print(type(float_to_int(a)[0]))
# >> <class 'int'>
# Scalar inputs are left as np.float64
print(type(float_to_int(b)))
# >> <class 'numpy.float64'>
字符串
有三件事我不明白:
1.为什么标量和数组的类型转换不同?
1.为什么np.floor()
要进行类型转换(对于数组输入)?
1.如何可靠地将标量和数组的np.float64
转换为int
?
3条答案
按热度按时间kq4fsx7k1#
我认为,由于Numpy和python数据类型是相关的,但本质上是不同的,因此您必须显式地将其转换为python数据类型。
一种方法是:
字符串
或者可选地
型
当你将numpy数组转换为对象数据类型时,它在内部将其存储为python对象。对象数据类型是灵活的,在转换过程中可以推断。
hc2pp10m2#
为了处理这个无聊的“标量”,有两个可能有用的工具是
item
和math
模块。字符串
通过提取浮点数组的元素来生成标量(我不建议直接使用
np.float64()
):型
以原生python的形式提取这些价值
型
b.tolist()
和float(b)
也可以工作。math
有很多与numpy相同的函数,但它是为处理单个python值而设计的,而且速度更快。型
与
np.floor
相反,它返回np
个数字,即使给定的是python数字。Numpy函数就像谚语中的锤子,“一切都是钉子/numpy数组”。型
使用此方法需要测试以区分标量,例如检查
b.ndim
是否为0。我对强制转换为
object
dtype发表了评论。请注意,这个转型是不同的数组和数组标量:型
一个是数组(即使
np.array(1.23)
也是这样转换的);另一个是Python,如item()
。因此,下面的np.floor
调用将必须使用非常不同的类。numpy
函数对对象dtype数组的操作有点笨拙。通常,它以列表理解的方式迭代,对每个元素应用某种方法。对于操作符,它显然使用了类似于.__add__
的方法。对于np.sin
(以及类似对象),错误表明它正在尝试执行[i.sin() for i in arr]
。我们只能猜测它试图用
np.float
做什么。也许它在做[math.floor(i) for i in arr]
。6yt4nkrj3#
1.在NumPy中,标量和数组由于其独特的特性和使用场景而被不同地对待。表示单个值的标量在NumPy中被视为零维数组,而数组具有更高的秩或维度。这种差异会影响类型转换操作的行为。
查看文档了解更多信息:
1.对于数组输入
a
,float_to_int(a)
返回一个数组,其中元素向下舍入到最接近的整数。当您使用[0]
访问第一个元素时,它返回Pythonint
,因为您正在显式访问该元素,Python会自动将数据类型转换为int
。对于标量输入
b
,float_to_int(b)
返回np.float64
类型的标量,因为它与原始数据类型一致。