如何在 Python 中有效地将 32 位整数转换为四个 8 位整数的数组?

目前我有以下代码,它非常慢:

def convert(int32_val):
    bin = np.binary_repr(int32_val, width = 32)
    int8_arr = [int(bin[0:8],2), int(bin[8:16],2),
                int(bin[16:24],2), int(bin[24:32],2)]
    return int8_arr

例如:
print convert(1)
>>> [0, 0, 0, 1]

print convert(-1)
>>> [255, 255, 255, 255]

print convert(-1306918380)
>>> [178, 26, 2, 20]

我需要在无符号 32 位整数上实现相同的行为。

此外。是否可以将其矢量化为 32 位整数的大型 numpy 数组?

最佳答案

使用 dtype 记录在:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

Subdivide int16 into 2 int8‘s, called x and y. 0 and 1 are the offsets in bytes:

np.dtype((np.int16, {'x':(np.int8,0), 'y':(np.int8,1)}))
dtype(('<i2', [('x', '|i1'), ('y', '|i1')]))

或适应您的情况:
In [30]: x=np.arange(12,dtype=np.int32)*1000
In [39]: dt=np.dtype((np.int32, {'f0':(np.uint8,0),'f1':(np.uint8,1),'f2':(np.uint8,2), 'f3':(np.uint8,3)}))

In [40]: x1=x.view(dtype=dt)

In [41]: x1['f0']
Out[41]: array([  0, 232, 208, 184, 160, 136, 112,  88,  64,  40,  16, 248], dtype=uint8)

In [42]: x1['f1']
Out[42]: array([ 0,  3,  7, 11, 15, 19, 23, 27, 31, 35, 39, 42], dtype=uint8)

比较
In [38]: x%256
Out[38]: array([  0, 232, 208, 184, 160, 136, 112,  88,  64,  40,  16, 248])

有关 http://docs.scipy.org/doc/numpy/user/basics.rec.html 的更多文档



获取 4 个字节的二维数组的一种方法是:
In [46]: np.array([x1['f0'],x1['f1'],x1['f2'],x1['f3']])
Out[46]:
array([[  0, 232, 208, 184, 160, 136, 112,  88,  64,  40,  16, 248],
       [  0,   3,   7,  11,  15,  19,  23,  27,  31,  35,  39,  42],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)

同样的想法,但更紧凑:
In [50]: dt1=np.dtype(('i4', [('bytes','u1',4)]))

In [53]: x2=x.view(dtype=dt1)

In [54]: x2.dtype
Out[54]: dtype([('bytes', 'u1', (4,))])

In [55]: x2['bytes']
Out[55]:
array([[  0,   0,   0,   0],
       [232,   3,   0,   0],
       [208,   7,   0,   0],
       [184,  11,   0,   0],
       [160,  15,   0,   0],
       [136,  19,   0,   0],
       [112,  23,   0,   0],
       [ 88,  27,   0,   0],
       [ 64,  31,   0,   0],
       [ 40,  35,   0,   0],
       [ 16,  39,   0,   0],
       [248,  42,   0,   0]], dtype=uint8)

In [56]: x2
Out[56]:
array([    0,  1000,  2000,  3000,  4000,  5000,  6000,  7000,  8000,
        9000, 10000, 11000])

关于python - 在 Python 中将 32 位整数转换为四个 8 位整数的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25298592/

10-10 09:04