python - numpy 角度函数为相同的输入返回不同的答案?
问题描述
我正在使用 Python 3.7.7 和 numpy 1.19.1。这是代码:
import numpy as np
a = 55.74947517067784019673 + 0j
print(f'{-a == -1 * a}, {np.angle(-a)}, {np.angle(-1 * a)}')
这是输出:
True, -3.141592653589793, 3.141592653589793
我有两个问题:
- 为什么角度函数对相同的输入给出不同的输出?
- 根据文档,角度输出范围是
(-pi, pi]
,那么为什么输出之一是-np.pi
?
解决方案
如果您查看的来源,np.angle
它使用了该功能np.arctan2
。现在,根据numpy docs,np.arctan2
使用具有以下规则的底层 C 库:
请注意,+0 和 -0 是不同的浮点数,+inf 和 -inf 也是如此。
使用 计算时会导致不同的行为+/-0
。因此,在这种情况下,规则是:
y: +/- 0
x: <0
angle: +/- pi
现在,如果您尝试:
a = 55.74947517067784019673
print(f'{-a == -1 * a}, {np.angle(-a)}, {np.angle(-1 * a)}')
#True, 3.141592653589793, 3.141592653589793
如果你尝试:
a = 55.74947517067784019673 + 0j
print(-a)
#(-55.74947517067784-0j)
print(-1*a)
#(-55.74947517067784+0j)
print(f'{-a == -1 * a}, {np.angle(-a)}, {np.angle(-1 * a)}')
#True, -3.141592653589793, 3.141592653589793
这与库协议是内联的。
至于你的第二个问题,我想这是一个错字/错误,因为np.arctan2
文档说:
以弧度为单位的角度数组,范围为[-pi, pi]。如果 x1 和 x2 都是标量,则这是一个标量。
-a
vs.的解释-1*a
:
首先,55.74947517067784019673 + 0j
不是构造复数,而只是将浮点数添加到复数(要显式构造复数,请注意整数没有带符号的零,只有浮点数具有)。只是简单地还原符号并且非常不言自明。让我们看看计算时会发生什么:complex(55.74947517067784019673, 0.0)
-a
-1*a
为简单起见假设a = 55.5 + 0j
- 首先
a = 55.5+0j
转换为complex(55.5, 0.0)
- 第二
-1
等于complex(-1.0, 0.0)
- Then
complex(-1.0, 0.0)*complex(55.5, 0.0)
等于complex((-1.0*55.5 - 0.0*0.0), (-1.0*0.0 + 0.0*55.5))
等于complex((-55.5 - 0.0), (-0.0 + 0.0))
which then 等于complex(-55.5, 0.0)
。
请注意,-0.0+0.0
等于和符号规则仅适用于此链接0.0
中提到的乘法和除法,并在下面的评论中引用。为了更好地理解它,请参阅:
print(complex(-1.0, -0.0)*complex(55.5, 0.0))
#(-55.5-0j)
虚部在哪里(-0.0*55.5 - 1.0*0.0) = (-0.0 - 0.0) = -0.0
推荐阅读
- android - 是否可以给用户免费订阅?
- woocommerce - 在 Woocommerce 预订中将家庭人员类型计为多人
- java - doPost 不返回响应 servlet
- python-3.x - PyQt5:如何将 clicked.connect 和 setStyleSheet 写在一行中?
- scala - Scalatra 响应状态
- javascript - 在 React 中循环外部数据后无法正确设置状态
- android - 无法从具有自定义背景的按钮中删除顶部和底部填充
- python - 使用 shell 脚本执行 python 脚本 - 在 sh 中确定的变量
- r - 世界地图ggplot2上的边框和颜色
- google-translate - 如何更改谷歌翻译的文本