[Numpy-discussion] astype None

Keith Goodman kwgoodman at gmail.com
Thu May 20 22:52:20 EDT 2010


On Thu, May 20, 2010 at 7:36 PM,  <josef.pktd at gmail.com> wrote:
> On Thu, May 20, 2010 at 9:00 PM, Keith Goodman <kwgoodman at gmail.com> wrote:
>> While automating some unit tests for my labeled array class, larry, I
>> assumed that
>>
>> np.array([1, 2], dtype=dtype)
>>
>> would give the same result as
>>
>> np.array([1, 2]).astype(dtype)
>>
>> But it doesn't for dtype=None:
>>
>>>> np.array([1, 2, 3], dtype=None)
>>   array([1, 2, 3])
>>>> np.array([1, 2, 3]).astype(None)
>>   array([ 1.,  2.,  3.])
>>
>> I prefer the behavior of array where dtype=None is a no-op.
>
> Since nobody who knows this answered, I try my explanation
>
> It's all in the docs
>
> astype(None)  cast to a specified type
>
> here the dtype is "None"
> None is by default float_
>>>> np.dtype(None)
> dtype('float64')
>
> np.array([1, 2, 3], dtype=None)
> np.asarray([1, 2, 3], dtype=None)
>
> here dtype is a keyword argument where None is not a dtype but
> triggers the default, which is:
> dtype : data-type, optional
> By default, the data-type is inferred from the input data.
>
> Shall we start a list of inconsistent looking corner cases ?)

It's easy to find this sort of stuff with short nose tests. Here's a
quick hacked example:

import numpy as np
from numpy.testing import assert_equal

def test_astype_dtype():
    "array.astype test"
    dtypes = [float, int, str, bool, complex, object, None]
    seqs = ([0, 1], [1.0, 2.0])
    msg1 = 'arrays failed on dtype %s and sequence %s'
    msg2 = 'dtype are different when dtype=%s and seq=%s'
    for dtype in dtypes:
        for seq in seqs:
            ar1 = np.array(list(seq), dtype=dtype)    # array does dtype
            ar2 = np.array(list(seq)).astype(dtype)   # astype does dtype
            yield assert_equal, ar1, ar2, msg1 % (dtype, seq)
            yield assert_equal, ar1.dtype, ar2.dtype, msg2 % (dtype, seq)

The output is

===================
FAIL: array.astype test
--------------------------------------------
<...>
AssertionError:
Items are not equal: dtype are different when dtype=None and seq=[0, 1]
 ACTUAL: dtype('int64')
 DESIRED: dtype('float64')



More information about the NumPy-Discussion mailing list