4

我试图找到一种使用特定缩放函数将 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  

我无法弄清楚如何避免循环并仍然执行 if... 并应用缩放功能。

谢谢

4

2 回答 2

3

尝试:

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

它假设 val 是 0 到 65535 之间的 32 位整数

于 2013-06-18T16:55:34.190 回答
2

您可以使用掩码从 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事先创建:

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

编辑:正如乔金顿在对该问题的评论中指出的那样,这是以记忆换取速度。

于 2013-06-18T17:30:37.863 回答