Python 存储数字介于-255和255之间的numpy数组的最小方法?

Python 存储数字介于-255和255之间的numpy数组的最小方法?,python,arrays,python-3.x,numpy,memory,Python,Arrays,Python 3.x,Numpy,Memory,存储这个占用最少内存的阵列的方法是什么?uint8不工作,因为某些值为负值,而int8不工作,因为某些值高于127。int16可以工作,但我希望它占用更少的空间 我是否应该将它作为numpy数组,并将其存储为常规python列表 这是数组(我只包括前几行,如果您想要整个数组,请告诉我) 我试过了 import numpy as np a = np.array([[[ 218, 219, 223], [ 0, 0, 0], [ 2, 2

存储这个占用最少内存的阵列的方法是什么?uint8不工作,因为某些值为负值,而int8不工作,因为某些值高于127。int16可以工作,但我希望它占用更少的空间

我是否应该将它作为numpy数组,并将其存储为常规python列表

这是数组(我只包括前几行,如果您想要整个数组,请告诉我)

我试过了

import numpy as np
a = np.array([[[ 218,  219,  223],
        [   0,    0,    0],
        [   2,    2,    2],
        [   1,    1,    1],
        [   0,    0,    0],
        [   0,    0,    0],
        [   0,    0,    0],
        [   0,    0,    0],
        [  -3,   -3,   -3],
        [  -1,   -1,   -1],
        [   0,    0,    0],
        [  -1,   -1,   -1],
        [   0,    0,    0]]], dtype=np.int16)
signs = a<0.astype(np.bool)
a=a.astype(np.uint8)

尽管压缩字节为106字节,但uint8+符号仍会丢失到原始int16。这些大小由sys.getsizeof()报告;如果使用len(x.tostring()),原始数组将有78个字节,无符号8位数组有39个字节,布尔符号有39个字节,压缩符号有5个字节。

一种策略是将绝对值存储为UINT8数组,将符号值存储为单独的布尔数组,例如0表示负数,1表示正数。Boolean的占用空间比Int小得多。在NumPy中,Boolean数据类型需要一个字节。要通过在一个字节中存储多个数字的符号来实际节省内存,您必须编写执行适当位旋转的代码。您的实际阵列有多大?您要保存多少内存?
将其存储在工作内存中,或者存储在某种文件中?@Divakar抱歉,我解释了它differently@hpaulj像一个文件,比如说我想制作一个压缩图像文件
import numpy as np
a = np.array([[[ 218,  219,  223],
        [   0,    0,    0],
        [   2,    2,    2],
        [   1,    1,    1],
        [   0,    0,    0],
        [   0,    0,    0],
        [   0,    0,    0],
        [   0,    0,    0],
        [  -3,   -3,   -3],
        [  -1,   -1,   -1],
        [   0,    0,    0],
        [  -1,   -1,   -1],
        [   0,    0,    0]]], dtype=np.int16)
signs = a<0.astype(np.bool)
a=a.astype(np.uint8)
signs2 = np.packbits(signs, axis=None)