【发布时间】:2013-06-18 16:40:49
【问题描述】:
我试图找到一种使用特定缩放函数将 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... 并应用缩放功能。
谢谢
【问题讨论】:
-
仅供参考:绝对不需要循环。如果您没有严格的内存限制,只需执行
byte_array = (255.0 * (pixel_array - minVal) / (maxVal - minVal - 1.0)).astype(np.uint8)。之后您可以使用byte_array[pixel_array == paddingVal] = 0设置“填充”值。它的内存效率不高,但它会比你目前正在做的要快得多。 -
那肯定更快。可爱的蟒蛇可以做到这一点。
-
请注意,我在评论中发布的版本隐含地采用了值的下限而不是四舍五入。如果您对此感到满意,它会比调用
numpy.round快一点,但它与您的原始代码不同(不过,@jorgeca 的答案应该与您的原始解决方案给出相同的结果)。