Binary Sort on Python List __xor__
Peter Otten
__peter__ at web.de
Sun May 31 05:33:44 EDT 2020
evan.schalton at gmail.com wrote:
> I frequently use binary as bool placeholders and find myself filtering
> lists based on those bools, this seems to have a similar semantic meaning
> as the bit wise ^ or __xor__ operator and could add syntactic sugar to the
> base list class.
>
> Use Case:
>
> Controlling a stepper at half-step has the following cycle steps:
>
> CYCLE = [
> [1,0,0,0],
> [1,1,0,0],
> [0,1,0,0],
> [0,1,1,0],
> [0,0,1,0],
> [0,0,1,1],
> [0,0,0,1],
> [1,0,0,1],
> ]
>
> which can be represented as follows:
>
> CYCLE = [
> 1<<3,
> 1<<3|1<<2,
[...]
> on a raspberrypi, using (for illustration's sake) GPIO pins 1,2,3,4 I'd
> like to use the __xor__ method (currently not implemented) to perform the
> bit-wise filter as follows:
Python isn't C;)
A matrix of booleans *can* be expressed using bit twiddling, but I don't
see the point.
Just the other day I read that raspis now come with up to 8 GB memory.
Here's an alternative:
>>> import numpy
>>> CYCLE = [
... [1,0,0,0],
... [1,1,0,0],
... [0,1,0,0],
... [0,1,1,0],
... [0,0,1,0],
... [0,0,1,1],
... [0,0,0,1],
... [1,0,0,1],
... ]
>>> cycle = numpy.array(CYCLE, dtype=bool)
>>> cycle
array([[ True, False, False, False],
[ True, True, False, False],
[False, True, False, False],
[False, True, True, False],
[False, False, True, False],
[False, False, True, True],
[False, False, False, True],
[ True, False, False, True]], dtype=bool)
>>> numpy.where(cycle[1])
(array([0, 1]),)
That's zero-based indexing, as it should be; you can convert with
>>> numpy.where(cycle[1])[0] + 1
array([1, 2])
or (similar to your list subclass) you can pick arbitrary values:
>>> labels = np.array(["first", "second", "third", "fourth"])
>>> labels[cycle[0]]
array(['first'],
dtype='<U6')
>>> labels[cycle[1]]
array(['first', 'second'],
dtype='<U6')
More information about the Python-list
mailing list