np.int16和int16 matlab有什么区别?

5

我正在将Matlab代码转换为Python。在Matlab中有一行代码将复数转换为int16:

real = int16(real(-3.406578165491512e+04 + 9.054663292273188e+03i));
imag= int16(imag(-3.406578165491512e+04 + 9.054663292273188e+03i));  

real= -32768
imag=9055

在Python中,我尝试了以下方法:

real = np.int16(round(np.real(-3.406578165491512e+04 + 9.054663292273188e+03j)))
imag = np.int16(round(np.imag(-3.406578165491512e+04 + 9.054663292273188e+03j)))

real= 31470
imag=9055

我的结果不同(我有许多不同的值,比如(1.815808483565253e+04 + 3.533772674703890e+04j)得到了不同的答案!)请问你能帮我得到相同的答案吗?

2个回答

7

MATLAB的输出已经达到了 intmin('int16') = -32768文档),即它作为一个int16类型变量可以表示的最小值。

Python对于int16类型也有相同的范围(文档),但不同的是,它没有饱和,而是在下溢后绕回到范围的顶部。

k = round(-3.406578165491512e+04) = -34066
k = k + (32768*2) = 31470

你可以通过在输入为浮点数时强制实施你首选的行为方式来解决这个问题,然后当输入在范围-32768到32767内时,你可以将其转换为int16

5

Wolfie理解了两者之间的差异,这是关于如何解决它的。如果您可以接受截断,那么您可以使用iinfo来获取整数类型的最小和最大值(或硬编码,如果您知道不会从int16更改它),然后使用clip将浮点数限制在这些范围内,然后再转换。

n = -3.406578165491512e+04

ii = np.iinfo(np.int16)
print(f"min = {ii.min}") # min = -32768
print(f"max = {ii.max}") # max = 32767

np.int16(np.clip(n, ii.min, ii.max))
# -32768

需要注意:此方法仅在浮点数的大小大于整数的大小时才可靠,因为它依赖于能够将 ii.max 准确表示为浮点数。如需了解更多信息,请参见此处

以下是一个失败的示例:

n = np.float64(1e100)

ii = np.iinfo(np.int64)
print(f"max: {ii.max}") # max = 9223372036854775807

clipped = np.clip(n, ii.min, ii.max)
print(f"clipped to: {int(clipped)}") # clipped to: 9223372036854775808
print(f"as int: {np.int64(clipped)}") # as int: -9223372036854775808

这是因为ii.max无法表示为浮点数。当超过9007199254740992时,我们会失去精度的1,只能指定偶数,因此剪切的边界变得不正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接