A NumPy scalar is any object which is an instance of np.generic or whose type is in np.ScalarType:
In [12]: np.ScalarType
Out[13]:
(int,
float,
complex,
long,
bool,
str,
unicode,
buffer,
numpy.int16,
numpy.float16,
numpy.int8,
numpy.uint64,
numpy.complex192,
numpy.void,
numpy.uint32,
numpy.complex128,
numpy.unicode_,
numpy.uint32,
numpy.complex64,
numpy.string_,
numpy.uint16,
numpy.timedelta64,
numpy.bool_,
numpy.uint8,
numpy.datetime64,
numpy.object_,
numpy.int64,
numpy.float96,
numpy.int32,
numpy.float64,
numpy.int32,
numpy.float32)
This definition comes from looking at the source code for np.isscalar:
def isscalar(num):
if isinstance(num, generic):
return True
else:
return type(num) in ScalarType
Note that you can test if something is a scalar by using np.isscalar:
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
How do we know what we know?
I like learning how people know what they know—more than the answers themselves. So let me try to explain where the above answer comes from.
Having the right tools can help you figure out things like this for yourself.
I found this out by using IPython. Using its TAB-completion feature, typing
In [19]: import numpy as np
In [20]: np.[TAB]
causes IPython to display all variables in the np module namespace. A search for the string "scalar" will lead you to np.ScalarType and np.isscalar. Typing
In [20]: np.isscalar?
(note the question mark at the end) prompts IPython to show you where np.isscalar is defined:
File: /data1/unutbu/.virtualenvs/dev/lib/python2.7/site-packages/numpy/core/numeric.py
which is how I got to the definition of isscalar. Alternatively, the NumPy documentation for isscalar has a link to the source code as well.
A NumPy scalar is any object which is an instance of np.generic or whose type is in np.ScalarType:
In [12]: np.ScalarType
Out[13]:
(int,
float,
complex,
long,
bool,
str,
unicode,
buffer,
numpy.int16,
numpy.float16,
numpy.int8,
numpy.uint64,
numpy.complex192,
numpy.void,
numpy.uint32,
numpy.complex128,
numpy.unicode_,
numpy.uint32,
numpy.complex64,
numpy.string_,
numpy.uint16,
numpy.timedelta64,
numpy.bool_,
numpy.uint8,
numpy.datetime64,
numpy.object_,
numpy.int64,
numpy.float96,
numpy.int32,
numpy.float64,
numpy.int32,
numpy.float32)
This definition comes from looking at the source code for np.isscalar:
def isscalar(num):
if isinstance(num, generic):
return True
else:
return type(num) in ScalarType
Note that you can test if something is a scalar by using np.isscalar:
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
How do we know what we know?
I like learning how people know what they know—more than the answers themselves. So let me try to explain where the above answer comes from.
Having the right tools can help you figure out things like this for yourself.
I found this out by using IPython. Using its TAB-completion feature, typing
In [19]: import numpy as np
In [20]: np.[TAB]
causes IPython to display all variables in the np module namespace. A search for the string "scalar" will lead you to np.ScalarType and np.isscalar. Typing
In [20]: np.isscalar?
(note the question mark at the end) prompts IPython to show you where np.isscalar is defined:
File: /data1/unutbu/.virtualenvs/dev/lib/python2.7/site-packages/numpy/core/numeric.py
which is how I got to the definition of isscalar. Alternatively, the NumPy documentation for isscalar has a link to the source code as well.
In this context, a scalar is one of the things you put in an array. A single 64-bit float or 32-bit int, for example, rather than a whole array of them.
Videos
You can use the item() function:
import numpy as np
matrix = np.array([[[[7]]]])
print(matrix.item())
Output
7
Numpy has a function explicitly for this purpose: asscalar
>>> np.asscalar(np.array([24]))
24
This uses item() in the implementation.
I guess asscalar was added to more explicit about what's going on.
Update:
As of 2023 this function has been removed from NumPy (see v1.23 release notes).
Am I correct in treating scalars as souped-up versions of 'standard' Python data types (+ some new data types not in base Python), which happen to have the same attributes and methods that ndarrays have, even though many of such attributes/methods are meaningless to scalars?
The one part that confuses me a lot on the document is the term "array scalars". What does the word array have to do with the scalar?
https://numpy.org/doc/stable/reference/arrays.scalars.html