[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