0

0

NumPy vectorize 导致数值“舍入”为最接近的整数:原因及解决方案

碧海醫心

碧海醫心

发布时间:2025-08-03 17:04:19

|

236人浏览过

|

来源于php中文网

原创

numpy vectorize 导致数值“舍入”为最接近的整数:原因及解决方案

第一段引用上面的摘要:

本文探讨了在使用 NumPy 的 vectorize 函数时,可能出现的数值精度问题,即函数输出结果非预期地变为 0 或 1。通过分析问题代码,解释了数据类型溢出是导致此现象的原因,并提供了两种解决方案:将整数转换为浮点数,以及避免使用 np.vectorize。同时,展示了优化后的代码示例,以避免潜在的精度损失,保证计算结果的准确性。

问题分析

在使用 numpy.vectorize 时,如果输出结果全部是 0 或 1,很可能是由于数据类型溢出导致的。具体来说,当计算结果超出 NumPy 数组所能表示的最大值时,就会发生溢出,导致结果不准确。

例如,在原始代码中,2**n 这样的表达式,当 n 足够大时,其结果可能超过 int32 的表示范围,导致溢出,从而影响后续计算。

import numpy as np

def epsilon(n):
    return 1.6952445781450207*2**(-1.028148909051717*n)

def pPsi(n):
    return 1.0577183294485202*2**(-1.028620169094481*n)

def perrMaxFunc(n):
    res=epsilon(n)/(2*np.abs(1/2**n-pPsi(n)))
    return min([1,res])

vectorized_perr=np.vectorize(perrMaxFunc)

nmax=500;

perrMax=vectorized_perr([i for i in range(nmax)])
print(perrMax)
print(perrMaxFunc(500))

解决方案

以下提供两种解决方案,避免数据类型溢出,确保计算结果的准确性。

1. 使用浮点数

最直接的解决方法是将涉及指数运算的数值转换为浮点数。这可以通过以下两种方式实现:

  • 将常量 2 替换为 2.0。
  • 确保传递给函数的参数 n 是浮点数类型。

修改后的代码如下:

EasySite
EasySite

零代码AI网站开发工具

下载
import numpy as np

def epsilon(n):
    return 1.6952445781450207*2.**(-1.028148909051717*n)

def pPsi(n):
    return 1.0577183294485202*2.**(-1.028620169094481*n)

def perrMaxFunc(n):
    res = epsilon(n)/(2.*np.abs(1/2.**n-pPsi(n)))
    return min([1,res])

vectorized_perr=np.vectorize(perrMaxFunc)

nmax=500;

perrMax=vectorized_perr([i for i in range(nmax)])
print(perrMax)
print(perrMaxFunc(500))

通过将 2 替换为 2.,可以强制将指数运算的结果转换为浮点数,从而避免溢出。

2. 避免使用 np.vectorize

np.vectorize 本质上是一个循环,效率并不高。NumPy 提供了许多向量化的函数,可以直接对数组进行操作,效率更高。例如,可以使用 np.minimum 代替 min 函数,并直接对 NumPy 数组进行操作。

修改后的代码如下:

import numpy as np

def epsilon(n):
    return 1.6952445781450207*2.**(-1.028148909051717*n)

def pPsi(n):
    return 1.0577183294485202*2.**(-1.028620169094481*n)

def perrMaxFunc(n):
    res = epsilon(n)/(2.*np.abs(1/2.**n-pPsi(n)))
    return np.minimum(1,res)


nmax= 500

perrMax=perrMaxFunc(np.arange(nmax))
print(perrMax)
print(perrMaxFunc(500))

在这个例子中,我们使用了 np.minimum 函数,它可以直接对数组进行操作,而不需要使用 np.vectorize。 此外,直接对 np.arange(nmax) 生成的数组进行操作,也避免了使用列表推导式,提高了代码效率。

总结

在使用 NumPy 进行数值计算时,需要注意数据类型溢出的问题。通过将整数转换为浮点数,或者避免使用 np.vectorize,可以直接对 NumPy 数组进行操作,可以有效避免溢出问题,并提高代码效率。同时,建议尽可能使用 NumPy 提供的向量化函数,以充分利用 NumPy 的性能优势。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

306

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

28

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

149

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

120

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号