There are several major differences. The first is that python integers are flexible-sized (at least in python 3.x). This means they can grow to accommodate any number of any size (within memory constraints, of course). The numpy integers, on the other hand, are fixed-sized. This means there is a maximum value they can hold. This is defined by the number of bytes in the integer (int32 vs. int64), with more bytes holding larger numbers, as well as whether the number is signed or unsigned (int32 vs. uint32), with unsigned being able to hold larger numbers but not able to hold negative number.

So, you might ask, why use the fixed-sized integers? The reason is that modern processors have built-in tools for doing math on fixed-size integers, so calculations on those are much, much, much faster. In fact, python uses fixed-sized integers behind-the-scenes when the number is small enough, only switching to the slower, flexible-sized integers when the number gets too large.

Another advantage of fixed-sized values is that they can be placed into consistently-sized adjacent memory blocks of the same type. This is the format that numpy arrays use to store data. The libraries that numpy relies on are able to do extremely fast computations on data in this format, in fact modern CPUs have built-in features for accelerating this sort of computation. With the variable-sized python integers, this sort of computation is impossible because there is no way to say how big the blocks should be and no consistentcy in the data format.

That being said, numpy is actually able to make arrays of python integers. But rather than arrays containing the values, instead they are arrays containing references to other pieces of memory holding the actual python integers. This cannot be accelerated in the same way, so even if all the python integers fit within the fixed integer size, it still won't be accelerated.

None of this is the case with Python 2. In Python 2, Python integers are fixed integers and thus can be directly translated into numpy integers. For variable-length integers, Python 2 had the long type. But this was confusing and it was decided this confusion wasn't worth the performance gains, especially when people who need performance would be using numpy or something like it anyway.

Answer from TheBlackCat on Stack Overflow
Top answer
1 of 3
62

There are several major differences. The first is that python integers are flexible-sized (at least in python 3.x). This means they can grow to accommodate any number of any size (within memory constraints, of course). The numpy integers, on the other hand, are fixed-sized. This means there is a maximum value they can hold. This is defined by the number of bytes in the integer (int32 vs. int64), with more bytes holding larger numbers, as well as whether the number is signed or unsigned (int32 vs. uint32), with unsigned being able to hold larger numbers but not able to hold negative number.

So, you might ask, why use the fixed-sized integers? The reason is that modern processors have built-in tools for doing math on fixed-size integers, so calculations on those are much, much, much faster. In fact, python uses fixed-sized integers behind-the-scenes when the number is small enough, only switching to the slower, flexible-sized integers when the number gets too large.

Another advantage of fixed-sized values is that they can be placed into consistently-sized adjacent memory blocks of the same type. This is the format that numpy arrays use to store data. The libraries that numpy relies on are able to do extremely fast computations on data in this format, in fact modern CPUs have built-in features for accelerating this sort of computation. With the variable-sized python integers, this sort of computation is impossible because there is no way to say how big the blocks should be and no consistentcy in the data format.

That being said, numpy is actually able to make arrays of python integers. But rather than arrays containing the values, instead they are arrays containing references to other pieces of memory holding the actual python integers. This cannot be accelerated in the same way, so even if all the python integers fit within the fixed integer size, it still won't be accelerated.

None of this is the case with Python 2. In Python 2, Python integers are fixed integers and thus can be directly translated into numpy integers. For variable-length integers, Python 2 had the long type. But this was confusing and it was decided this confusion wasn't worth the performance gains, especially when people who need performance would be using numpy or something like it anyway.

2 of 3
36

Another way to look at the differences is to ask what methods do the 2 kinds of objects have.

In Ipython I can use tab complete to look at methods:

In [1277]: x=123; y=np.int32(123)

int methods and attributes:

In [1278]: x.<tab>
x.bit_length   x.denominator  x.imag         x.numerator    x.to_bytes
x.conjugate    x.from_bytes   x.real         

int 'operators'

In [1278]: x.__<tab>
x.__abs__           x.__init__          x.__rlshift__
x.__add__           x.__int__           x.__rmod__
x.__and__           x.__invert__        x.__rmul__
x.__bool__          x.__le__            x.__ror__
...
x.__gt__            x.__reduce_ex__     x.__xor__
x.__hash__          x.__repr__          
x.__index__         x.__rfloordiv__     

np.int32 methods and attributes (or properties). Some of the same, but a lot more, basically all the ndarray ones:

In [1278]: y.<tab>
y.T             y.denominator   y.ndim          y.size
y.all           y.diagonal      y.newbyteorder  y.sort
y.any           y.dtype         y.nonzero       y.squeeze   
...
y.cumsum        y.min           y.setflags      
y.data          y.nbytes        y.shape   

the y.__ methods look a lot like the int ones. They can do the same math.

In [1278]: y.__<tab>
y.__abs__              y.__getitem__          y.__reduce_ex__
y.__add__              y.__gt__               y.__repr__
...
y.__format__           y.__rand__             y.__subclasshook__
y.__ge__               y.__rdivmod__          y.__truediv__
y.__getattribute__     y.__reduce__           y.__xor__

y is in many ways the same as a 0d array. Not identical, but close.

In [1281]: z=np.array(123,dtype=np.int32)

np.int32 is what I get when I index an array of that type:

In [1300]: A=np.array([0,123,3])

In [1301]: A[1]
Out[1301]: 123

In [1302]: type(A[1])
Out[1302]: numpy.int32

I have to use item to remove all of the numpy wrapping.

In [1303]: type(A[1].item())
Out[1303]: int

As a numpy user, an np.int32 is an int with a numpy wrapper. Or conversely a single element of an ndarray. Usually I don't pay attention as to whether A[0] is giving me the 'native' int or the numpy equivalent. In contrast to some new users, I rarely use np.int32(123); I would use np.array(123) instead.

A = np.array([1,123,0], np.int32)

does not contain 3 np.int32 objects. Rather its data buffer is 3*4=12 bytes long. It's the array overhead that interprets it as 3 ints in a 1d. And view shows me the same databuffer with different interpretations:

In [1307]: A.view(np.int16)
Out[1307]: array([  1,   0, 123,   0,   0,   0], dtype=int16)

In [1310]: A.view('S4')
Out[1310]: array([b'\x01', b'{', b''],   dtype='|S4')

It's only when I index a single element that I get a np.int32 object.

The list L=[1, 123, 0] is different; it's a list of pointers - pointers to int objects else where in memory. Similarly for a dtype=object array.

🌐
Python Data Science Handbook
jakevdp.github.io › PythonDataScienceHandbook › 02.01-understanding-data-types.html
Understanding Data Types in Python | Python Data Science Handbook
Notice the main difference: in C, the data types of each variable are explicitly declared, while in Python the types are dynamically inferred. This means, for example, that we can assign any kind of data to any variable: ... Here we've switched the contents of x from an integer to a string.
🌐
GitHub
github.com › pandas-dev › pandas › issues › 27731
Object dtype for int64 and Int64 values in column · Issue #27731 · pandas-dev/pandas
August 3, 2019 - What is the difference between "Int64" and "int64"? After concat it has "object" dtype. [1] has type: <class 'int'> [2] has type: <class 'int'> [3] has type: <class 'int'> [4] has type: <class 'int'> [5] has type: <class 'int'> [1] has type: <class 'int'> [2] has type: <class 'int'> [3] has type: <class 'int'> [4] has type: <class 'int'> [5] has type: <class 'int'> df1: int64 df2: Int64 df3: object
Author   Zoynels
🌐
Sololearn
sololearn.com › en › Discuss › 7797 › y-do-we-have-int-int16-int32-and-int64
y do we have int, int16, int32, and int64 | Sololearn: Learn to code for FREE!
The number you can save in int16 is bigger than the number you can save in int. As the number after int rises the length of the number you save rises. Int16 is 16 bit, int32 is 32 bit and int64 is 64 bit.
🌐
Google Groups
groups.google.com › g › numpy › c › 6nCcuw3NkKw
[Numpy-discussion] PyInt and Numpy's int64 conversion
Hi, I'm using Numpy from the C python api side while tweaking my SWIG interface to work with numpy array types. I want to convert a numpy array of integers (whose elements are numpy's 'int64') The problem is that it this int64 type is not compatible with the standard python integer type: I ...
🌐
GitHub
github.com › blaze › datashape › issues › 95
Discover Python int as int32 instead of int64 · Issue #95 · blaze/datashape
September 24, 2014 - Should we default to int32 for basic Python ints? This is more compatible with DyND and, I think, CPython itself. Current Behavior >>> discover(1) ctype("int64") Proposed Behavio...
Author   mrocklin
🌐
Librarycarpentry
librarycarpentry.github.io › library-python › 03-data-types-and-format
Python for Librarians: Data Types and Formats
August 1, 2018 - An integer will never have a decimal point. Thus 1.13 would be stored as 1. 1234.345 is stored as 1234. You will often see the data type Int64 in Python which stands for 64 bit integer.
Find elsewhere
🌐
NumPy
numpy.org › doc › stable › user › basics.types.html
Data types — NumPy v2.4 Manual
NumPy knows that int refers to numpy.int_, bool means numpy.bool, that float is numpy.float64 and complex is numpy.complex128. The other data-types do not have Python equivalents. Sometimes the conversion can overflow, for instance when converting a numpy.int64 value 300 to numpy.int8.
🌐
Data-apis
data-apis.org › array-api › 2022.12 › API_specification › data_types.html
Data Types — Python array API standard 2022.12 documentation
The default integer data type should be the same across platforms, but the default may vary depending on whether Python is 32-bit or 64-bit. The default array index data type may be int32 on 32-bit platforms, but the default should be int64 otherwise.
🌐
DataCamp
campus.datacamp.com › courses › preprocessing-for-machine-learning-in-python › introduction-to-data-preprocessing
Working with data types | Python
The object type is what pandas ... a mixture of types. int64 and float64 are equivalent to the Python integer and float types, where the 64 refers to the allocation of memory alloted for storing the values, in this case, the number of bits....
🌐
Codegive
codegive.com › blog › numpy_int64_vs_int.php
Numpy int64 vs int
However, for scientific computing, especially when dealing with large arrays of numbers, the built-in Python int can sometimes fall short in terms of performance and memory efficiency. This is where libraries like NumPy step in, offering fixed-size integer types like numpy.int64 that are optimized ...
🌐
GitHub
github.com › pymc-devs › pymc › issues › 2366
Discrete variables: int16 vs int32 vs int64 · Issue #2366 · pymc-devs/pymc
June 29, 2017 - here (https://github.com/pymc-devs/pymc3/blob/master/pymc3/distributions/distribution.py#L124) we have float32 => int16, else int64
Author   denadai2
🌐
GitHub
github.com › numpy › numpy › issues › 12322
dtype(int) is int64 not python int · Issue #12322 · numpy/numpy
November 3, 2018 - >>> import numpy as np >>> a = ... to be Python compatible integer. Specifically Python integers have unlimited precision, but numpy is limited to only 63 binary digits....
Author   ra1u
🌐
Codegive
codegive.com › blog › convert_numpy_int64_to_int.php
Converting NumPy int64 to Python int
Range: Because it's fixed-size, ... memory-efficient than storing millions of Python int objects, as each np.int64 takes exactly 8 bytes (plus array overhead), while a Python int is a full-fledged object....
🌐
Python Forum
python-forum.io › thread-42567.html
System showing np.int64(xxx) as output
I was using Numpy and try to find the number in an array which is the closest to the number 57. I write the following code. a = np.array() x = 57 aThe output I get is Output:np.int64(63) instead of 63