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

发布于 2021-01-29 19:33:26

在对音频或图像阵列进行一些处理之后,需要先在一定范围内对其进行标准化,然后才能将其写回到文件中。可以这样完成:

# 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()似乎无关。

关注者
0
被浏览
104
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。
    audio /= np.max(np.abs(audio),axis=0)
    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解决方案。


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

    image = image.astype('float64')
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看