Python 如何将bool类型的numpy数组压缩为大小为1/8的uint8

Python 如何将bool类型的numpy数组压缩为大小为1/8的uint8,python,numpy,casting,binary,Python,Numpy,Casting,Binary,我想“压缩”一个大的布尔数组(Ny,Nx)。将它们转换为大小为(Ny,Nx//8)的uint8数组的最快方法是什么,其中每个布尔平面存储在uint8的下一位 到目前为止,我实现了以下目标: import numpy as np def compressImage(imdata): imdatashape = imdata.shape imdata_4d = imdata imdata_4d.shape = *imdatashape[:-1], imdatashap

我想“压缩”一个大的布尔数组(Ny,Nx)。将它们转换为大小为(Ny,Nx//8)的uint8数组的最快方法是什么,其中每个布尔平面存储在uint8的下一位

到目前为止,我实现了以下目标:


import numpy as np

def compressImage(imdata):

    imdatashape = imdata.shape
    imdata_4d = imdata

    imdata_4d.shape = *imdatashape[:-1], imdatashape[-1]//8,8
    compressed_image = np.zeros(imdata_4d.shape[:-1], np.uint8)
    # take every image and add it with the right bit shift to the final image
    for i in range(8):
        compressed_image += imdata_4d[...,i] << i
    return compressed_image


imdata = np.random.randint(0,1, (500, 1600,2560), dtype=np.uint8)
imcompressed = compressImage(imdata)

将numpy作为np导入
def压缩图像(imdata):
imdatashape=imdata.shape
imdata_4d=imdata
imdata_4d.shape=*imdatashape[:-1],imdatashape[-1]//8,8
压缩图像=np.0(imdata\U 4d.shape[:-1],np.uint8)
#拍摄每幅图像,并将其与右位移位一起添加到最终图像
对于范围(8)中的i:

压缩图像+=imdata\u 4d[…,i]使用
np.packbits

np.packbits(imdata,axis=-1,bitorder="little")
注意
np.random.randint(0,1,(500,1600,2560),dtype=np.uint8)
只会生成一个零数组,因为
randint
中的上限是独占的。如果要生成二进制数组,请使用
np.random.randint(0,2,(5,1600,2560),dtype=np.uint8)