Python 二进制数据的大数组

Python 二进制数据的大数组,python,Python,我正在处理一个大型的三维二进制数据数组,每个值是两个可能值中的一个。目前,我将此数据作为1或0的int32对象存储在numpy数组中 它对小型阵列工作正常,但最终我需要制作5000x5000x20阵列,如果没有“内存错误”,我甚至无法接近它 有没有人对更好的方法有什么建议?我真的希望我能将所有数据都保存在一个数据结构中,因为我需要沿着所有三个轴访问它的切片。如果您将numpy数组的数据类型更改为更小的数据类型,您将获得更好的性能 对于可以采用两个值之一的数据,可以使用uint8,该值始终为单个字

我正在处理一个大型的三维二进制数据数组,每个值是两个可能值中的一个。目前,我将此数据作为1或0的int32对象存储在numpy数组中

它对小型阵列工作正常,但最终我需要制作5000x5000x20阵列,如果没有“内存错误”,我甚至无法接近它


有没有人对更好的方法有什么建议?我真的希望我能将所有数据都保存在一个数据结构中,因为我需要沿着所有三个轴访问它的切片。

如果您将numpy数组的数据类型更改为更小的数据类型,您将获得更好的性能

对于可以采用两个值之一的数据,可以使用
uint8
,该值始终为单个字节:

arr = np.array(your_data, dtype=np.uint8)
或者,您可以使用
np.bool
,尽管我不确定这实际上是一个8位的值,还是它使用了本机字号。(为了清晰起见,我倾向于明确使用8位值,不过这更像是个人的选择。)


不过,在一天结束时,您谈论的是大量数据,即使使用较小的值集,也很可能无法将所有数据同时加载到python中


在这种情况下,是否可以将问题分解为更小的部分可能值得研究。

另一种可能性是将20位的最后一个轴表示为单个32位整数。这样,5000x5000阵列就足够了。

当您只需要一个阵列时,为什么要使用32位?尝试
int8
/
bool\uz
,您得到的空间是原来的四倍;查看数据中有多少是1s,有多少是0s。如果你主要有一个或另一个,你应该考虑使用稀疏数组数据结构。在上面提到的DOC链接中,NoMPy中的布尔值是字节。谢谢!看起来使用np.uint8我可以为我的数据创建一个足够大的数组。作为一个附带问题,您使用什么来查找对象的内存大小?我使用的是sys.getsizeof(),它说np.uint8和np.bool都是12个字节,与int32相同。@user3927843-你可以使用
.nbytes
,例如
np.uint8(1)。nbytes
sys.getsizeof
将返回数据类型对象的大小,而不是基础数据的大小,如果这是个好主意,但这可能会使某些操作更加困难(因为需要屏蔽)。真正取决于OP如何使用三维空间;这是空间与时间的通常权衡。