簡體   English   中英

具有 1 位條目的 numpy 布爾數組

[英]numpy boolean array with 1 bit entries

numpy 有沒有辦法創建一個布爾數組,每個條目只使用 1 位?

標准的np.bool類型是 1 個字節,但這樣我使用了所需內存的 8 倍。

在 Google 上,我發現 C++ 有std::vector<bool>

為此,您可以使用 numpy 的原生packbitsunpackbits 第一個函數使用起來很簡單,但要重建你需要額外的操作。 下面是一個例子:

import numpy as np
# original boolean array
A1 = np.array([
    [0, 1, 1, 0, 1],
    [0, 0, 1, 1, 1],
    [1, 1, 1, 1, 1],
], dtype=np.bool)

# packed data
A2 = np.packbits(A1, axis=None)

# checking the size
print(len(A1.tostring())) # 15 bytes
print(len(A2.tostring())) #  2 bytes (ceil(15/8))

# reconstructing from packed data. You need to resize and reshape
A3 = np.unpackbits(A2, axis=None)[:A1.size].reshape(A1.shape).astype(np.bool)

# and the arrays are equal
print(np.array_equal(A1, A3)) # True

你想要一個位數組

高效的布爾數組——C 擴展

該模塊提供了一種有效表示布爾數組的對象類型。 位數組是序列類型,其行為與通常的列表非常相似。 八位由一個連續的內存塊中的一個字節表示。 用戶可以在兩種表示之間進行選擇; 小端和大端。 所有功能都用 C 實現。提供了訪問機器表示的方法。 當需要對二進制文件(例如便攜式位圖圖像文件 (.pbm))進行位級訪問時,這會很有用。 此外,在處理使用可變位長編碼的壓縮數據時,您可能會發現此模塊很有用...

您可能想看看位此處的文檔)。

如果您從文件創建ConstBitArrayConstBitStream ,則它將使用mmap而不會將其加載到內存中。 在這種情況下,它不會是可變的,因此如果您想進行更改,則必須將其加載到內存中。

例如在不加載到內存的情況下創建:

>>> a = bitstring.ConstBitArray(filename='your_file')

或者

>>> b = bitstring.ConstBitStream(a_file_object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM