【问题标题】:how to reverse scale a scaled numpy array?如何反向缩放缩放的 numpy 数组?
【发布时间】:2025-12-01 19:45:02
【问题描述】:

我有一个 numpy 数组,例如:

signal =array([[    0,     0,     0,  3485,  3480,  3474],
               [    0,     0,     0,  5644,  5642,  5655],
               [    0,     0,     0,  6622,  6541,  6623],
               [ 4555,  4656, 11232, 11265, 11564, 11553],
               [ 3450,  3455,  3536,  3510,  3564,  3375]])

我使用了缩放((signal) / np.max(signal)*255).astype(np.uint8) 变成了

f = array([[  0,   0,   0,  76,  76,  76],
           [  0,   0,   0, 124, 124, 124],
           [  0,   0,   0, 146, 144, 146],
           [100, 102, 247, 248, 255, 254],
           [ 76,  76,  77,  77,  78,  74]], dtype=uint8)

所以,现在我想从f 数组生成signal 数组。 我尝试了反向比例, (f * np.max(signal)/255).astype(np.uint32) 但它给了我

array([[  0,   0,   0, 105, 105, 105],
       [  0,   0,   0, 226, 226, 226],
       [  0,   0,   0, 195, 105, 195],
       [165, 256, 150, 195, 255, 210],
       [105, 105, 150, 150, 196,  14]])

这是不合适的。 那么我应该怎么做才能反转数组的缩放以获得之前的原始输入数据呢?

【问题讨论】:

  • 使用f.astype(np.uint32) * np.max(signal) // 255,您可以在量化后获得最佳重建效果。
  • @MichaelSzczesny 谢谢,它的工作

标签: python numpy


【解决方案1】:

您正在将具有 dtype uint8 的数组与信号的最大值相乘。这种数据类型不能容纳这么大的整数,因此会发生溢出,并且数字被包装到 0->255 的范围内。您必须先将其转换为uint32,然后再进行缩放:

signal = f.astype(np.uint32) * np.max(signal)/255

在此之后,输出仍会与原始结果略有不同,这是因为将浮点结果转换为 uint8 会导致您的数字丢失分数。

【讨论】: