0

这个占用内存最少的数组怎么存储呢?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)
4

1 回答 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+signs 仍然输给原始 int16。这些大小由 sys.getsizeof() 报告;如果你使用 len(x.tostring()) 你会发现原始数组有 78 个字节,无符号 8 位数组有 39 个字节,布尔符号有 39 个字节,压缩符号有 5 个字节。

于 2019-12-13T17:03:29.197 回答