首页 > 解决方案 > numpy.rint 支持复数而 numpy.floor 不支持有什么特殊原因吗?

问题描述

我只是好奇,numpy.rint 似乎支持复数是否有任何具体原因,例如

np.rint(3.1+2.3j)

(3+2j)

而 numpy.floor numpy.ceil 不

np.floor(3.1+2.3j)

回溯(最近一次调用最后一次):文件“”,第 1 行,类型错误:输入类型不支持 ufunc 'floor',并且输入无法安全地强制>根据强制转换规则“安全”到任何支持的类型''*

我在定点硬件模拟中使用它们,为 np.floor 处理单独的实部和图像部分有点烦人,而 np.rint 处理复数就好了......

标签: numpyroundingcomplex-numbers

解决方案


从文档:

标量 x 的下限是最大整数 i,使得 i <= x。它通常表示为 \lfloor x \rfloor。

按你的推理floor(1+2.3j)应该是1+2j吧?让我们测试一下:

numpy 的比较规则是这样的:

In [259]: np.array([1+2j])<=np.array([1+2.3j])
Out[259]: array([ True])

但不是 Python complex

In [254]: 1+2j<=1+2.3j
Traceback (most recent call last):
  File "<ipython-input-254-982f3ee0b6f8>", line 1, in <module>
    1+2j<=1+2.3j
TypeError: '<=' not supported between instances of 'complex' and 'complex'

Python的实现:

In [255]: import math
In [256]: math.floor(1+2.3j)
Traceback (most recent call last):
  File "<ipython-input-256-be3a7370c225>", line 1, in <module>
    math.floor(1+2.3j)
TypeError: can't convert complex to float

sympy更明确地概括为复数:

Floor 是一个单变量函数,它返回不大于其参数的最大整数值。此实现通过分别取实部和虚部的下限将下限推广到复数。

Octave/MATLAB也明确了它的泛化。

我不知道这种概括在数学上是否稳健。Wiki 文章仅提及complex. 该math线程指出了此扩展的歧义(由于复数的排序问题)。

https://math.stackexchange.com/questions/2095674/floor-function-in-complex-plane


推荐阅读