ojy*_*ojy 4 python numpy vectorization
如何在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
Run Code Online (Sandbox Code Playgroud)
例如:
print convert(1)
>>> [0, 0, 0, 1]
print convert(-1)
>>> [255, 255, 255, 255]
print convert(-1306918380)
>>> [178, 26, 2, 20]
Run Code Online (Sandbox Code Playgroud)
我需要在无符号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')]))
Run Code Online (Sandbox Code Playgroud)
或适应您的情况:
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)
Run Code Online (Sandbox Code Playgroud)
相比
In [38]: x%256
Out[38]: array([ 0, 232, 208, 184, 160, 136, 112, 88, 64, 40, 16, 248])
Run Code Online (Sandbox Code Playgroud)
有关http://docs.scipy.org/doc/numpy/user/basics.rec.html的更多文档
2)元组参数:适用于记录结构的唯一相关元组案例是将结构映射到现有数据类型.这是通过在元组中配对来完成的,现有数据类型具有匹配的dtype定义(使用此处描述的任何变体).作为示例(使用列表的定义,请参阅3)以获取更多详细信息):
x = np.zeros(3,dtype =('i4',[('r','u1'),('g','u1'),('b','u1'),('a' , 'U1')]))
数组([0,0,0])
x ['r']#array([0,0,0],dtype = uint8)
在这种情况下,生成一个数组,其外观和行为类似于一个简单的int32数组,但也有仅使用int32的一个字节的字段的定义(有点像Fortran等效).
获取4个字节的2d数组的一种方法是:
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)
Run Code Online (Sandbox Code Playgroud)
同样的想法,但更紧凑:
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])
Run Code Online (Sandbox Code Playgroud)