[Numpy-discussion] How to handle fields less than one byte in a recarray
Kim Hansen
slaunger@gmail....
Thu Jan 15 04:48:23 CST 2009
Hi Numpy forum
Let me start out with a generic example:
In [3]: test_byte_str = "".join(["\x12\x03", "\x23\x05", "\x35\x08"])
In [4]: desc = dtype({'names' : ["HIGHlow", "HIGH + low"], 'formats': [uint8, ui
nt8]})
In [5]: r = rec.fromstring(test_byte_str, dtype=desc)
In [6]: r[0]
Out[6]: (18, 3)
In [7]: r['HIGHlow']
Out[7]: array([18, 35, 53], dtype=uint8)
In [8]: high = r['HIGHlow'] >> 4
In [9]: high
Out[9]: array([1, 2, 3], dtype=uint8)
In [10]: low = r['HIGHlow'] & 0x0F
In [11]: low
Out[11]: array([2, 3, 5], dtype=uint8)
In [12]: high_plus_low = high + low
In [13]: high_plus_low
Out[13]: array([3, 5, 8], dtype=uint8)
In [14]: r["HIGH + low"]
Out[14]: array([3, 5, 8], dtype=uint8)
So I have here an array, where the first byte actually represents two
fields, HIGH and low, where HIGH are the four most significant bits
and low are the four least significant bits.
As you can see in the example I can figure out how to get an array of
HIGH and low by postprocessing the recordarray, but I would really
like to encapsulate this logic somehow inside the recordarray (or in
an instance of derived class), such that I could access the arrays
directly as
r["HIGH"] and r["low"]
or perhaps even better wrap it all up inside a class RWrapper, such that
r = RWrapper(test_byte_str)
r.low
would work
but not
r.HIGHlow
How do I implment that in a Pythonic way?
My real application is considerebaly more complicated, but I think
this describes the main problem.
More information about the Numpy-discussion
mailing list