Numpy square return 错误的数组值

Numpy square return wrong values for array

我有一个数据集,其中数字对由 32 位表示,每个数字表示为两个 8 位无符号整数。

我试图在一个数组中获取第一个实部,在第二个数组中获取复数部分。 然后我试图对每个部分进行平方,将它们加起来并取总和的平方根。 (又称量级)。 当我尝试使用 numpy.square 对每个数组的元素求平方时,我得到的不仅是负值,而且是不准确的值。 知道 on/what 出了什么问题吗?

import matplotlib.pyplot as plt
import numpy as np
import scipy.signal as signal

data = np.fromfile(r'C:\Users\Miaou\Desktop\RAW_DATA_000066_000008.bin', dtype="int16")

print(data)

Is = data[0::2]
Qs = data[1::2]
Is_square = np.square(Is, dtype='int16')
Qs_square = np.square(Qs, dtype='int16')

print('Is',Is)
print('Qs',Qs)
print('Is square',Is_square)
print('Qs square',Qs_square)

Output: Is [  335  -720  8294 ... -3377  3878  6759]
Qs [-2735  4047  1274 ...  -279  1319  4918]
Is square [-18847  -5888 -22364 ...    865  31140   5489]
Qs square [  9121  -5791 -15324 ...  12305 -29711   3940]

从您的 np.square() 调用中删除 dtype='int16'。

您正在经历 integer overflowint16(有符号)类型的最小值为-32768,最大值为32767。这样做的原因是因为你只有 16 位(这就是 int16)的意思。请注意 2^16 = 65536,但由于它是有符号的(允许负数),我们没有 065536 的值,但您可以想象它们向下移动,使得 0 居中(即 -3276832767

让我们以 Is 的第一个元素为例:

>>> 335**2
112225

注意112225 > 32767。这意味着你会溢出。它只是一直环绕,直到它落在有效范围内:

>>> x = 112225
>>> x = x - 2**16
>>> x
46689 # Still not in the valid range. Repeat.
>>> x = x - 2**16
>>> x
-18847 # Yep, now we are between -32768 and 32768

这里的另一个答案不太正确,因为省略 dtype 是不够的:

>>> Is = np.array([335, -720, 8294, -3377, 3878, 6759]).astype('int16')
>>> Is
array([  335,  -720,  8294, -3377,  3878,  6759], dtype=int16)
>>> Is_sq_nodtype = np.square(Is)
>>> Is_sq_nodtype
array([-18847,  -5888, -22364,    865,  31140,   5489], dtype=int16)

numpy 操作保持相同的数据类型。您实际上需要 "up" dtype 以获得更多位。 int32 应该可以为你的值做一些技巧(你也可以做 int64float 取决于你的值有多大,这里是一个数据类型列表:https://docs.scipy.org/doc/numpy-1.10.0/user/basics.types.html

工作示例:

>>> Is = np.array([335, -720, 8294, -3377, 3878, 6759]).astype('int16')
array([  335,  -720,  8294, -3377,  3878,  6759], dtype=int16)
>>> Is_sq = np.square(Is, dtype='int32')
>>> Is_sq
array([  112225,   518400, 68790436, 11404129, 15038884, 45684081], dtype=int32)

HTH.