Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is a NumPy int not an instance of a Python int, but a NumPy float is an instance of a Python float?

Consider the following:

>>> import numbers
>>> import numpy
>>> a = numpy.int_(0)
>>> isinstance(a, int)
False
>>> isinstance(a, numbers.Integral)
True
>>> b = numpy.float_(0)
>>> isinstance(b, float)
True
>>> isinstance(b, numbers.Real)
True

NumPy's numpy.int_ and numpy.float_ types are both in Python's numeric abstract base class hierarchy, but it is strange to me that a np.int_ object is not an instance of the built-in int class, while a np.float_ object is an instance of the built-in float type.

Why is this the case?

like image 643
Artem Mavrin Avatar asked Jul 05 '18 08:07

Artem Mavrin


People also ask

What is Numpy float?

Data Types in Python integer - used to represent integer numbers. e.g. -1, -2, -3. float - used to represent real numbers. e.g. 1.2, 42.42. boolean - used to represent True or False.

What is the difference between float and Numpy float64?

What is the difference between NumPy float64 and float? float64 are numpy specific 32 and 64-bit float types. Thus, when you do isinstance(2.0, np. float) , it is equivalent to isinstance(2.0, float) as 2.0 is a plain python built-in float type and not the numpy type.

How do you convert float to int in Python?

A float value can be converted to an int value no larger than the input by using the math. floor() function, whereas it can also be converted to an int value which is the smallest integer greater than the input using math. ceil() function.

Is a float Python?

Floats are one of the most common data formats in Python. The name “float” is short for “floating point number” and we use this data format to represent real numbers with both an integer and fractional component (typically by using a decimal).


1 Answers

Python integers can be arbitrary length: type(10**1000) is still int, and will print out a one and then a thousand zeros on your screen if you output it.

Numpy int64 (which is what int_ is on my machine) are integers represented by 8 bytes (64 bits), and anything over that cannot be represented. For example, np.int_(10)**1000 will give you a wrong answer - but quickly ;).

Thus, they are different kinds of numbers; subclassing one under the other makes as much sense as subclassing int under float would, is what I assume numpy people thought. It is best to keep them separate, so that no-one is confused about the fact that it would be unwise to confuse them.

The split is done because arbitrary-size integers are slow, while numpy tries to speed up computation by sticking to machine-friendly types.

On the other hand, floating point is the standard IEEE floating point, both in Python and in numpy, supported out-of-the-box by our processors.

like image 135
Amadan Avatar answered Sep 19 '22 05:09

Amadan