[Numpy-discussion] find_common_type broken?

Citi, Luca lciti at essex.ac.uk
Sun Jul 12 06:54:47 EDT 2009


Hi,
I am not very confident with types but I will try to give you
my opinion.

As for the first part of the question

> >>> np.find_common_type([np.ndarray, np.ma.MaskedArray, np.recarray], [])
> dtype('object')

I think that the first argument of np.find_common_type should be
the type of an _element_ of the array, not the type of the array.
In your case you are asking np.find_common_type the common type
between an array of arrays, an array of masked arrays, and
an array of record arrays. Therefore the best thing np can do
is to find object as common type.

Correctly:

>>> np.find_common_type([np.float64, np.int32], [])
dtype('float64')



As for the second part of the question np.find_common_type
internally uses np.dtype(t) for each type in input.

While the comparison between types work as expected:

>>> np.complex128 > np.complex64 > np.float64 > np.float32 > np.int64 > np.int32
True

the comparison between dtype(t) gives different results:

>>> np.dtype(np.float64) > np.dtype(np.int64)
True
>>> np.dtype(np.float32) > np.dtype(np.int64)
False
>>> np.dtype(np.float32) > np.dtype(np.int32)
False
>>> np.dtype(np.float32) > np.dtype(np.int16)
True

At first I thought the comparison was made based on the
number of bits in the mantissa or the highest integer
N for which N-1 was still representable.
But then I could not explain the first result.

What is surprising is that

>>> np.dtype(np.float32) > np.dtype(np.int32)
False
>>> np.dtype(np.float32) < np.dtype(np.int32)
False
>>> np.dtype(np.float32) == np.dtype(np.int32)
False

therefore the max() function in np.find_common_type
cannot tell which to return, and returns the first.

In fact:

>>> np.find_common_type([], [np.int64, np.float32])
dtype('int64')

but

>>> np.find_common_type([], [np.float32, np.int64])
dtype('float32')

which is unexpected.

Best,
Luca



More information about the NumPy-Discussion mailing list