为什么NumPy为数组和标量返回不同的类型?

g2ieeal7  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(90)

我有一些整数存储在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

kq4fsx7k

kq4fsx7k1#

我认为,由于Numpy和python数据类型是相关的,但本质上是不同的,因此您必须显式地将其转换为python数据类型。
一种方法是:

a = a.astype(np.int64).tolist()
b = int(b)

字符串
或者可选地

a = a.astype(np.int64).astype(object)
b = b.astype(np.int64).astype(object)


当你将numpy数组转换为对象数据类型时,它在内部将其存储为python对象。对象数据类型是灵活的,在转换过程中可以推断。

hc2pp10m

hc2pp10m2#

为了处理这个无聊的“标量”,有两个可能有用的工具是itemmath模块。

In [167]: import math

字符串
通过提取浮点数组的元素来生成标量(我不建议直接使用np.float64()):

In [168]: b = np.array([1.23,3.3])[0]
In [169]: type(b)
Out[169]: numpy.float64


以原生python的形式提取这些价值

In [170]: c = b.item()
In [171]: c
Out[171]: 1.23
In [172]: type(c)
Out[172]: float


b.tolist()float(b)也可以工作。
math有很多与numpy相同的函数,但它是为处理单个python值而设计的,而且速度更快。

In [174]: math.floor(c)
Out[174]: 1
In [175]: math.floor(b)
Out[175]: 1


np.floor相反,它返回np个数字,即使给定的是python数字。Numpy函数就像谚语中的锤子,“一切都是钉子/numpy数组”。

In [176]: np.floor(b)
Out[176]: 1.0
In [177]: type(_)
Out[177]: numpy.float64
In [178]: np.floor(c)
Out[178]: 1.0
In [179]: type(_)
Out[179]: numpy.float64


使用此方法需要测试以区分标量,例如检查b.ndim是否为0。
我对强制转换为object dtype发表了评论。请注意,这个转型是不同的数组和数组标量:

In [191]: np.array([1.23]).astype(object)
Out[191]: array([1.23], dtype=object)
In [192]: b.astype(object)
Out[192]: 1.23


一个是数组(即使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]

6yt4nkrj

6yt4nkrj3#

1.在NumPy中,标量和数组由于其独特的特性和使用场景而被不同地对待。表示单个值的标量在NumPy中被视为零维数组,而数组具有更高的秩或维度。这种差异会影响类型转换操作的行为。
查看文档了解更多信息:

1.对于数组输入afloat_to_int(a)返回一个数组,其中元素向下舍入到最接近的整数。当您使用[0]访问第一个元素时,它返回Python int,因为您正在显式访问该元素,Python会自动将数据类型转换为int
对于标量输入bfloat_to_int(b)返回np.float64类型的标量,因为它与原始数据类型一致。

相关问题