我在一個 numpy 整數陣列中有一個 1 和 0 的一維陣列,我想將這些值打包到一個無符號 32 位整數值陣列中。
例如,假設整數陣列是
{0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1
我想把它轉換成這個
{0b01111111111000000000000111111111,0b11111111111111110000111111111111}
我怎樣才能做到這一點?提前致謝
uj5u.com熱心網友回復:
我會使用numpy.packbits和numpy.frombuffer。雖然結果缺少第一個零,但 mcsoini 說它是預期的 - 零在那里,只是沒有列印。
import numpy as np
data = [0,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,
0,0,1,1,1,1,1,1,1,1,
1,1,1]
result = np.frombuffer(np.packbits(data).tobytes(), dtype=np.uint32)
print([bin(item) for item in result])
['0b11111111000000011110000001111111', '0b11111110000011111111111111111111']
uj5u.com熱心網友回復:
您使用 bitshift 將數字移動到正確的二進制索引。然后只需累積值。
(d << np.arange(len(d))).sum()
這里有一個更廣泛的版本:
# first, extend to a multiple of 32
d = np.append(d, np.zeros(len(d) & 31, dtype=d.dtype))
# reshape into Nx32
d = d.reshape((-1, 32))
# broadcasted bitshift
bits = d << np.arange(32, dtype=d.dtype))
# accumulate into one value per row
bits = bits.sum(axis=1)
uj5u.com熱心網友回復:
我認為你最好的選擇是通過字串:
d = [0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 0]
[bin(int("".join(map(str, integer)), 2))
for integer in np.array_split(d, len(d) / 32)]
# Out:
# ['0b1111111111000000000000111111111', '0b11111111111111110000111111111110']
我在輸入資料中添加了一個零,使長度成為 32 的倍數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351767.html
上一篇:為什么我可以將陣列作為輸入傳遞給使用numpy的lambda函式,但我不能將它傳遞給沒有numpy的lambda函式?
