存储编号在-255到255之间的numpy数组的最简单方法?

问题描述 投票:0回答:1

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

我不应该将其存储为numpy数组,而仅将其存储为常规python列表吗?

这是数组(如果您想让我知道整个数组,我仅包括前几行)

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=int16)
python arrays python-3.x numpy memory
1个回答
0
投票

我尝试过

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)

但是发现它实际上比原始的(206字节)要差,而符号比167要差,而uint8数组比167要差。布尔值似乎和uint8一样多-经过仔细研究,我发现packbits最终将带您到某个地方-

signs2 = np.packbits(signs, axis=None)

尽管打包字节为106字节,但uint8 +符号仍然输给原始int16。这些大小由sys.getsizeof()报告。如果使用len(x.tostring()),则原始数组为78个字节,无符号8bit数组为39个字节,布尔符号为39个字节,打包符号为5个字节。

© www.soinside.com 2019 - 2024. All rights reserved.