相关疑难解决方法(0)

将numpy dtypes转换为本机python类型

如果我有一个numpy dtype,我该如何自动将其转换为最接近的python数据类型?例如,

numpy.float32 -> "python float"
numpy.float64 -> "python float"
numpy.uint32  -> "python int"
numpy.int16   -> "python int"
Run Code Online (Sandbox Code Playgroud)

我可以尝试提出所有这些情况的映射,但是numpy是否提供了一些自动方式将其dtypes转换为最接近的可能的本机python类型?这种映射不一定是详尽无遗的,但它应该转换具有close python模拟的常见dtypes.我认为这已经发生在numpy的某个地方了.

python numpy

200
推荐指数
9
解决办法
18万
查看次数

float64到float32转换会产生意外结果

当我将float64数字转换为数字时,float32我得到一个奇怪的结果:

In [22]: np.float32(20140131.0)
Out[22]: 20140132.0
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

python numpy

5
推荐指数
1
解决办法
1255
查看次数

pytorch 的机器精度是多少,什么时候应该使用双打?

我正在对合成数据进行实验(例如拟合正弦曲线),我在 pytorch 中遇到了非常小的错误。一如约2.00e-7。我正在阅读有关机器精度的信息,它似乎非常接近机器精度。我怎么知道这是否会导致问题(或者它是否已经存在,例如我无法区分不同的错误,因为它们是“机器零”)。

错误:

p = np.array([2.3078539778125768e-07,
               1.9997889411762922e-07,
               2.729681222011256e-07,
               3.2532371115080884e-07])

m = np.array([3.309504692539563e-07,
                 4.1058904888091606e-06,
                 6.8326703386053605e-06,
                 7.4616147721799645e-06])
Run Code Online (Sandbox Code Playgroud)

让我感到困惑的是,我尝试将我认为的数字添加到较小的数字中,以便它没有返回任何差异,但它确实返回了一个差异(即我尝试a+eps = a使用eps = smaller than machine precision):

import torch

x1 = torch.tensor(1e-6)
x2 = torch.tensor(1e-7)
x3 = torch.tensor(1e-8)
x4 = torch.tensor(1e-9)

eps = torch.tensor(1e-11)

print(x1.dtype)
print(x1)
print(x1+eps)

print(x2)
print(x2+eps)

print(x3)
print(x3+eps)

print(x4)
print(x4+eps)
Run Code Online (Sandbox Code Playgroud)

输出:

torch.float32
tensor(1.0000e-06)
tensor(1.0000e-06)
tensor(1.0000e-07)
tensor(1.0001e-07)
tensor(1.0000e-08)
tensor(1.0010e-08)
tensor(1.0000e-09)
tensor(1.0100e-09)
Run Code Online (Sandbox Code Playgroud)

我希望一切都为零,但事实并非如此。有人可以向我解释发生了什么吗?如果我的损失接近,1e-7我应该使用double而不是float? 谷歌搜索似乎 single 是 float afaik 的精度。

如果我想使用双打,什么是缺点/优点 …

floating-point precision pytorch

5
推荐指数
1
解决办法
1060
查看次数

Numpy的float32和float比较

继续从Python float和numpy float32之间的差异开始

import numpy as np

a = 58682.7578125
print(type(a), a)
float_32 = np.float32(a)
print(type(float_32), float_32)
print(float_32 == a)
Run Code Online (Sandbox Code Playgroud)

印刷品:

<class 'float'> 58682.7578125
<class 'numpy.float32'> 58682.8
True
Run Code Online (Sandbox Code Playgroud)

我完全理解,比较浮点数是否相等不是一个好主意,但还是不应该为False(我们在谈论的是第一个十进制数字的差异,而不是0.000000001)?是否依赖系统?是否在某处记录了这种行为?

编辑:好吧,这是第三位小数:

print(repr(float_32), repr(a))
# 58682.758 58682.7578125
Run Code Online (Sandbox Code Playgroud)

但是我可以相信repr吗?那些如何最终存储在内部?

EDIT2:人们坚持以更高的精度打印float_32会给我它的表示形式。但是,正如我已经根据nympy的文档评论的那样:

%格式运算符要求将其参数转换为标准python类型

和:

print(repr(float(float_32)))
Run Code Online (Sandbox Code Playgroud)

版画

58682.7578125

@MarkDickinson 在这里给出了一个有趣的见解,显然repr应该是忠实的(然后他说这是不忠实的np.float32)。

因此,让我重申如下问题:

  • 在示例中,我如何获得的确切内部表示?如果这些相同,那么如果不解决,float_32a
  • 在python float和之间进行比较时,上/下转换的确切规则是什么np.float32?我猜想它会将float_32转换为float,尽管@WillemVanOnsem 在评论中建议相反

我的python版本:

在Win32上的Python 3.5.2(v3.5.2:4def2a2901a5,Jun 25 2016,22:18:55)[MSC v.1900 64位(AMD64)]

python floating-point numpy python-3.x

4
推荐指数
1
解决办法
3008
查看次数

小于或等于 numpy 浮点运算符?

我意识到 np.islcose() 函数可用于安全地检查浮点数是否相等。不过,目前让我感到困惑的是,使用标准 <= 运算符会得到不同的结果。例如:

add_to = 0.05
value64 = np.float64(0.3) + add_to*4
value32 = np.float32(0.3) + add_to*4
threshold = 0.5
print('is close?')
print(np.isclose(value64, threshold))
print(np.isclose(value32, threshold))
print('is less than or equals to?')
print(value64 <= threshold)
print(value32 <= threshold)
Run Code Online (Sandbox Code Playgroud)

给我

is close?
True
True
is less than or equals to?
True
False
Run Code Online (Sandbox Code Playgroud)

有没有人对此有明智的解决方法?我认为一种选择可能是为 numpy 浮点重载 python 比较运算符,并且(在该函数中)将两个浮点数四舍五入到小数点后第 8 位。但这是在速度有些重要的情况下,感觉有点麻烦。

在此先感谢您的帮助!

python floating-point numpy

3
推荐指数
2
解决办法
1619
查看次数

标签 统计

numpy ×4

python ×4

floating-point ×3

precision ×1

python-3.x ×1

pytorch ×1