Python 存储数字介于-255和255之间的numpy数组的最小方法?
存储这个占用最少内存的阵列的方法是什么?uint8不工作,因为某些值为负值,而int8不工作,因为某些值高于127。int16可以工作,但我希望它占用更少的空间 我是否应该将它作为numpy数组,并将其存储为常规python列表 这是数组(我只包括前几行,如果您想要整个数组,请告诉我) 我试过了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
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)