1. The first example should really throw an exception, because silent failures like this can be catastrophic:
py> from numpy import random
py> r = random.randint(2, size=10)
py> r
array([1, 0, 1, 1, 0, 1, 0, 1, 1, 1])
py> list(flex.bool(r))
[True, False, False, False, False, False, False, False, False, False]
This example is clearly due to incorrect assumptions about the internal representations of numpy ndarrays.
As far as I can tell, this is much worse than that as the numpy-to-flex conversion assumes the same element type in the source and target array.
Thus converting a numpy array of int's into a flex array of bools is illegal but this precondition is not asserted unfortunately.
Nasty indeed. I do not understand numpy well enough to propose a solution, I am afraid.
2. Although not as potentially catastrophic as the first, t
py> flex.int(range(10))[r[0]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Users/jstroud/Unison/Code/radialx/testdata/<ipython-input-753-f14587f0ceeb> in <module>()
----> 1 flex.int(range(10))[r[0]]
TypeError: 'numpy.int64' object is not iterable
For flex arrays, the following __getitem__ variants are tried in this order:
1. one that takes a tuple
2. one that takes a slice
3. one that takes a single index, of type long in C++
The problem I think is that we are missing a registered conversion from the type numpy.int64 to the type long, and therefore all 3 variants fail.
Somehow the first failure is reported.
Best wishes,
Luc