如何将 NumPy 数组规范化到一定范围内?

新手上路,请多包涵

在对音频或图像数组进行一些处理后,需要在一个范围内对其进行归一化,然后才能将其写回文件。这可以这样做:

 # Normalize audio channels to between -1.0 and +1.0
audio[:,0] = audio[:,0]/abs(audio[:,0]).max()
audio[:,1] = audio[:,1]/abs(audio[:,1]).max()

# Normalize image to between 0 and 255
image = image/(image.max()/255.0)

有没有更简洁、方便的功能方法来做到这一点? matplotlib.colors.Normalize() 似乎没有关系。

原文由 endolith 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 346
2 个回答
# Normalize audio channels to between -1.0 and +1.0
audio /= np.max(np.abs(audio),axis=0)
# Normalize image to between 0 and 255
image *= (255.0/image.max())

使用 /=*= 可以消除中间临时数组,从而节省一些内存。乘法比除法便宜,所以

image *= 255.0/image.max()    # Uses 1 division and image.size multiplications

image /= image.max()/255.0    # Uses 1+image.size divisions

由于我们在这里使用基本的 numpy 方法,我认为这是 numpy 中尽可能高效的解决方案。


就地操作不会更改容器数组的数据类型。由于所需的归一化值是浮点数,因此 audioimage 数组在执行就地操作之前需要具有浮点数据类型。如果它们还不是浮点数据类型,则需要使用 astype 转换它们。例如,

 image = image.astype('float64')

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果数组同时包含正数据和负数据,我会选择:

 import numpy as np

a = np.random.rand(3,2)

# Normalised [0,1]
b = (a - np.min(a))/np.ptp(a)

# Normalised [0,255] as integer: don't forget the parenthesis before astype(int)
c = (255*(a - np.min(a))/np.ptp(a)).astype(int)

# Normalised [-1,1]
d = 2.*(a - np.min(a))/np.ptp(a)-1

如果数组包含 nan ,一种解决方案可能是将它们删除为:

 def nan_ptp(a):
    return np.ptp(a[np.isfinite(a)])

b = (a - np.nanmin(a))/nan_ptp(a)

但是,根据您可能希望以不同方式对待 nan 的上下文。例如,插入值,用例如 0 替换 in,或引发错误。

最后,值得一提的是,即使这不是 OP 的问题, 标准化

 e = (a - np.mean(a)) / np.std(a)

原文由 user2821 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题