我正在寻找一种有效的方法来使用特定的缩放函数将 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
设置“填充”值。虽然它不是内存有效的,但比你目前正在做的要快得多。 - Joe Kingtonnumpy.round
要快一些,但它与您的原始代码不同(@jorgeca的答案应该与您的原始解决方案给出相同的结果)。 - Joe Kington