Convert list or numpy array of single element to float in python

150,324

Solution 1

Just access the first item of the list/array, using the index access and the index 0:

>>> list_ = [4]
>>> list_[0]
4
>>> array_ = np.array([4])
>>> array_[0]
4

This will be an int since that was what you inserted in the first place. If you need it to be a float for some reason, you can call float() on it then:

>>> float(list_[0])
4.0

Solution 2

You may want to use the ndarray.item method, as in a.item(). This is also equivalent to (the now deprecated) np.asscalar(a). This has the benefit of working in situations with views and superfluous axes, while the above solutions will currently break. For example,

>>> a = np.asarray(1).view()
>>> a.item()  # correct
1

>>> a[0]  # breaks
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array


>>> a = np.asarray([[2]])
>>> a.item()  # correct
2

>>> a[0]  # bad result
array([2])

This also has the benefit of throwing an exception if the array is not actually a scalar, while the a[0] approach will silently proceed (which may lead to bugs sneaking through undetected).

>>> a = np.asarray([1, 2])
>>> a[0]  # silently proceeds
1
>>> a.item()  # detects incorrect size
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can only convert an array of size 1 to a Python scalar

Solution 3

Use numpy.asscalar to convert a numpy array / matrix a scalar value:

>>> a=numpy.array([[[[42]]]])
>>> numpy.asscalar(a)
42

The output data type is the same type returned by the input’s item method.

It has built in error-checking if there is more than an single element:

>>> a=numpy.array([1, 2])
>>> numpy.asscalar(a)

gives:

ValueError: can only convert an array of size 1 to a Python scalar

Note: the object passed to asscalar must respond to item, so passing a list or tuple won't work.

Solution 4

np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead.

For example:

a = np.array([[0.6813]])
print(a.item())

gives:

0.6813

Solution 5

I would simply use,

np.asarray(input, dtype=np.float)[0]
  • If input is an ndarray of the right dtype, there is no overhead, since np.asarray does nothing in this case.
  • if input is a list, np.asarray makes sure the output is of the right type.
Share:
150,324
ᴊᴇsᴘᴇʀᴋ.ᴇᴛʜ
Author by

ᴊᴇsᴘᴇʀᴋ.ᴇᴛʜ

An engineer very passionate about writing code to solve problems. Strengths are Python and Unix. Passionate about Crypto as well.

Updated on July 23, 2021

Comments

  • ᴊᴇsᴘᴇʀᴋ.ᴇᴛʜ
    ᴊᴇsᴘᴇʀᴋ.ᴇᴛʜ over 2 years

    I have a function which can accept either a list or a numpy array.

    In either case, the list/array has a single element (always). I just need to return a float.

    So, e.g., I could receive:

    list_ = [4]
    

    or the numpy array:

    array_ = array([4])
    

    And I should return

     4.0
    

    So, naturally (I would say), I employ float(...) on list_ and get:

    TypeError: float() argument must be a string or a number
    

    I do the same to array_ and this time it works by responding with "4.0". From this, I learn that Python's list cannot be converted to float this way.

    Based on the success with the numpy array conversion to float this lead me to the approach:

    float(np.asarray(list_))
    

    And this works when list_ is both a Python list and when it is a numpy array.

    Question

    But it seems like this approach has an overhead first converting the list to a numpy array and then to float. Basically: Is there a better way of doing this?

  • kuropan
    kuropan almost 3 years
    Deprecated since version 1.16: Deprecated, use numpy.ndarray.item() instead.
  • Michael
    Michael over 1 year
    @Aaron Voelker has the best answer