如果您查看
np.angle
的
源代码,它使用了函数
np.arctan2
。现在,根据
numpy文档,
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)}')
如果你尝试:
a = 55.74947517067784019673 + 0j
print(-a)
print(-1*a)
print(f'{-a == -1 * a}, {np.angle(-a)}, {np.angle(-1 * a)}')
这符合库协议。
至于你的第二个问题,我猜这是一个打字错误/错误,因为np.arctan2
文档中写道:
角度数组(以弧度为单位),范围为[-pi, pi]。如果x1和x2都是标量,则为标量。
-a
与-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)
- 然后,
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))
,这等于complex(-55.5, 0.0)
。
注意,-0.0+0.0
等于0.0
,符号规则仅适用于乘法和除法,正如此链接中所述并在下面的评论中引用。为了更好地理解它,请参见以下内容:
print(complex(-1.0, -0.0)*complex(55.5, 0.0))
虚部为(-0.0*55.5 - 1.0*0.0) = (-0.0 - 0.0) = -0.0
-a
和-1 * a
一开始就不完全相等呢? - Julien