A
andrewfelch
Below is the code to/from Boolean arrays and Unsigned integers. On my
Pentium 4, functions such as "bitwise_and" are 32 times faster when run
on 32-bit integers instead of the entire-byte-consuming-Boolean.
Good luck all
uint32Mask =
numarray.array([0x00000001,0x00000002,0x00000004,0x00000008, \
0x00000010,0x00000020,0x00000040,0x00000080, \
0x00000100,0x00000200,0x00000400,0x00000800, \
0x00001000,0x00002000,0x00004000,0x00008000, \
0x00010000,0x00020000,0x00040000,0x00080000, \
0x00100000,0x00200000,0x00400000,0x00800000, \
0x01000000,0x02000000,0x04000000,0x08000000, \
0x10000000,0x20000000,0x40000000,0x80000000], numarray.UInt32)
uint32MaskInner = numarray.copy.deepcopy(uint32Mask)
uint32MaskInner.shape = [32,1]
uint32MaskOuter = numarray.copy.deepcopy(uint32Mask)
uint32MaskOuter.shape = [1,32]
def BoolToUInt32(myArr):
if myArr.size()%32 != 0:
print "Size is: ", myArr.size()
return
numarray.matrixmultiply(numarray.reshape(myArr,[myArr.size()/32,32]),uint32MaskInner).flat
def UInt32ToBool(myArr,destination=None):
if destination == None:
destination = numarray.zeros([myArr.size()*32],numarray.Bool)
#return
numarray.bitwise_and(numarray.reshape(myArr,[myArr.size(),1]),uint32MaskOuter).flat
#else:
destination.shape = [myArr.size(),32]
numarray.bitwise_and(numarray.reshape(myArr,[myArr.size(),1]),uint32MaskOuter,destination)
destination.shape = [destination.size()]
return destination
Test of code:
Pentium 4, functions such as "bitwise_and" are 32 times faster when run
on 32-bit integers instead of the entire-byte-consuming-Boolean.
Good luck all
uint32Mask =
numarray.array([0x00000001,0x00000002,0x00000004,0x00000008, \
0x00000010,0x00000020,0x00000040,0x00000080, \
0x00000100,0x00000200,0x00000400,0x00000800, \
0x00001000,0x00002000,0x00004000,0x00008000, \
0x00010000,0x00020000,0x00040000,0x00080000, \
0x00100000,0x00200000,0x00400000,0x00800000, \
0x01000000,0x02000000,0x04000000,0x08000000, \
0x10000000,0x20000000,0x40000000,0x80000000], numarray.UInt32)
uint32MaskInner = numarray.copy.deepcopy(uint32Mask)
uint32MaskInner.shape = [32,1]
uint32MaskOuter = numarray.copy.deepcopy(uint32Mask)
uint32MaskOuter.shape = [1,32]
def BoolToUInt32(myArr):
if myArr.size()%32 != 0:
print "Size is: ", myArr.size()
return
numarray.matrixmultiply(numarray.reshape(myArr,[myArr.size()/32,32]),uint32MaskInner).flat
def UInt32ToBool(myArr,destination=None):
if destination == None:
destination = numarray.zeros([myArr.size()*32],numarray.Bool)
#return
numarray.bitwise_and(numarray.reshape(myArr,[myArr.size(),1]),uint32MaskOuter).flat
#else:
destination.shape = [myArr.size(),32]
numarray.bitwise_and(numarray.reshape(myArr,[myArr.size(),1]),uint32MaskOuter,destination)
destination.shape = [destination.size()]
return destination
Test of code:
1import numarray
gram.UInt32ToBool(ni) array([1, 0, 0, ..., 0, 0, 0], type=Bool)
numarray.all(numarray.equal(n,gram.UInt32ToBool(gram.BoolToUInt32(n)))) 1
n array([1, 0, 0, ..., 0, 0, 0], type=Bool)
n.shape (1024,)
numarray.all(numarray.equal(n,gram.UInt32ToBool(gram.BoolToUInt32(n))))