numpy - 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 处理复数就好了......
解决方案
从文档:
标量 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
推荐阅读
- ssh - GCP vm实例浏览器ssh失败
- scala - 在 YARN 中提交的 Spark 作业写入一个非常大的文件,即使该文件夹不存在也会引发 FileAlreadyExistsException
- r - R中的Rmpi和Parallel包有什么区别
- python - 使用 aioftp 客户端上传文件
- nativescript - 如何在nativescript中实现android Recyclerview类的功能
- html - 环聊 api 卡片修剪文本
- db2 - 如何删除作为模块一部分的函数?
- python - Python 生成器的缺点?
- python - Python中的快速傅里叶变换
- python - 如何在 Django 模型中使用字符串传递类名