NumPy types with underscore: `int_`, `float_`, etc

From page 21 of Guide to Numpy by TE Oliphant:

Names for the data types that would clash with standard Python object names are followed by a trailing underscore, ’ ’. These data types are so named because they use the same underlying precision as the corresponding Python data types.

. . .

The array types bool_, int_, complex_, float_, object_, unicode_, and str_ are enhanced-scalars. They are very similar to the standard Python types (without the trailing underscore) and inherit from them (except for bool_ and object_). They can be used in place of the standard Python types whenever desired. Whenever a data type is required, as an argument, the standard Python types are recognized as well.


If you're unsure if your variable is scalar, list, or array, using the ones with "_" will ensure your code will work regardless (if that's the behavior you intended). See the example code below.

As of numpy version 1.20.0, np.float64 or np.float32 works on scalars and lists.

import numpy as np  # numpy >= 1.20.0
scalar = 3
L1 = [3]
L2 = [1, 2, 3]

np.float64(scalar)  # okay
np.float64(L1)  # okay
np.float64(L2)  # okay

np.float_(scalar)  # okay
np.float_(L1)  # okay
np.float_(L2)  # okay

Note that np.float_ is just an alias of np.double.