将int16 numpy数组扩展到int8 numpy数组的有效方法是什么

2024-10-01 07:38:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种有效的方法,使用特定的缩放函数将2字节(-32K->;+32K)numpy int数组缩放到8位(0->;255)。 非常低效的方法是(其中minVal和maxVal是原始2字节numpy数组中的最小值和最大值,而原始数组中的paddingVal将设置为0):

...

pixel_array = np.zeros( length, dtype=np.int16)
byte_array = np.zeros( length, dtype=np.uint8)

....

i = 0
for val in np.nditer(pixel_array):
    value = 0.0
    if val == paddingVal:
        byte_array[i] = 0
    else:
        value = 255.0 * ( val - minVal ) / (maxVal - minVal - 1.0)    
        byte_array[i] = (round(value))
    i += 1  

我不知道如何避免这个循环,但仍然做如果。。。并应用缩放函数。在

泰铢


Tags: 方法函数gtnumpy字节valuenpval
2条回答

尝试:

byte_array[i] = (((val << 16) >> 8) & 0xFF0000) >> 16

它假设val是介于0和65535之间的32位整数

您可以使用遮罩从numpy的矢量化(隐式循环)中获益,这将更快:

mask = pixel_array == paddingVal
byte_array[mask] = 0
byte_array[~mask] = np.round(255.0 * (pixel_array[~mask] - minVal) / (maxVal - minVal - 1.0))

也可以这样做,这样更干净,因为您不必事先创建byte_array

^{pr2}$

编辑:正如joekington在一篇关于这个问题的评论中所指出的,这是用内存来换取速度的。在

相关问题 更多 >