Python:NumPy数组的struct.pack和struct.unpack

Python:NumPy数组的struct.pack和struct.unpack,python,numpy,struct,Python,Numpy,Struct,我正在探索struct.pack和struct.unpack的NumPy版本。我的特殊问题是将RGB值(r,g,b)转换为二进制 例如: f = lambda r, g, b: struct.unpack('I', struct.pack('BBBB', r, g, b, 255))[0] f(155, 156, 148) #--> 4287929499 import numpy as np import struct img_rgb = np.random.randint(0, 25

我正在探索
struct.pack
struct.unpack
的NumPy版本。我的特殊问题是将RGB值
(r,g,b)
转换为二进制

例如:

f = lambda r, g, b: struct.unpack('I', struct.pack('BBBB', r, g, b, 255))[0]
f(155, 156, 148)
#--> 4287929499
import numpy as np
import struct

img_rgb = np.random.randint(0, 256, (480, 640, 3))
%%time
np.apply_along_axis(lambda rgb: struct.unpack('I', struct.pack('BBBB', rgb[0], rgb[1], rgb[2], 255))[0], 2, img_rgb)
#--> Wall time: 5.23 s
当我将此转换应用于图像(RGB的二维阵列)时,它会变得非常慢

例如:

f = lambda r, g, b: struct.unpack('I', struct.pack('BBBB', r, g, b, 255))[0]
f(155, 156, 148)
#--> 4287929499
import numpy as np
import struct

img_rgb = np.random.randint(0, 256, (480, 640, 3))
%%time
np.apply_along_axis(lambda rgb: struct.unpack('I', struct.pack('BBBB', rgb[0], rgb[1], rgb[2], 255))[0], 2, img_rgb)
#--> Wall time: 5.23 s
我的问题是是否有
struct.pack
struct.unpack
的NumPy版本?或者,如何使用NumPy使代码更快?

您不需要在NumPy中使用和操作,因为它使用原始二进制数组,而不是单独将每个值包装到单独的对象中。通常,您使用的操作有、、和

在您的特定情况下,您有和
(M,N,3)
图像,您希望向其添加255个通道并将其转换为:

通过将最后一个维度设置为大小4,可以确保现在可以直接按以下方式查看数据:

结果将是形状
(M,N,1)
。可以使用以下方法删除额外的尺寸标注:

这并没有给你带来多少好处:它删除了方便的3通道表示,而不改变内存布局。将
img_rgba
result
转储到原始二进制文件将产生相同的结果


通常,在numpy中,像这样的函数通常是代码气味。它们并不比为-循环运行显式的
。您的目标应该始终是将代码矢量化,以便一次对所有元素执行操作。

太棒了!这种方法将计算速度提高了150倍。
result = np.squeeze(img_rgba.view(np.uint32))