NumPy的mgrid中传入同时含实部虚部的复数参数作用是什么?
NumPy mgrid复数步长运行逻辑解释
首先先明确mgrid官方定义的两种标准用法,也就是你已经了解的规则:
- 当第三个参数为实数时,走
np.arange逻辑,参数含义为步长,生成左闭右开区间的序列,不包含终止值 - 当第三个参数为纯虚数时,走
np.linspace逻辑,虚部的数值为生成序列的元素个数,生成左闭右闭区间的序列,包含终止值
你尝试的同时包含实部和虚部的复数作为步长的场景,属于NumPy没有在官方文档中明确说明的非标准用法,不同版本的处理逻辑存在差异:
当前主流稳定版的NumPy,处理任意复数步长的逻辑是统一的:
- 只要步长是复数类型,就直接进入linspace生成分支,忽略实部的步长含义
- 计算复数的模
abs(step)后向下取整,作为生成序列的元素总数N - 调用
linspace(起始值, 终止值, N, endpoint=True)生成最终序列
按照这个逻辑,你输入的1+5j的模为sqrt(1^2+5^2)≈5.099,向下取整为5,最终生成的序列应该是[-5. -2.5 0. 2.5 5. ],和纯虚数5j的输出一致。
你得到的特殊输出,是因为你使用的是较旧版本的NumPy,旧版本对非纯虚数的复数步长处理逻辑不完善:除了取虚部数值作为元素个数外,还会把复数的实部作为步长偏移量,调整最终的终止值为原终止值 - 实部数值,再按照固定步长生成序列,才会出现你看到的不包含终止值、步长特殊的结果。这种非标准用法的结果没有通用性,不同版本可能完全不同,不建议在生产代码中使用。
内容的提问来源于stack exchange,提问作者lpnorm
相关产品推荐
相关产品推荐

