将单个元素的列表或 numpy 数组转换为 python 中的浮点数

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

我有一个函数可以接受列表或 numpy 数组。

在任何一种情况下,list/array 都有一个元素(总是)。我只需要 return 一个浮点数。

所以,例如,我可以收到:

list_ = [4]

或 numpy 数组:

array_ = array([4])

我应该return

 4.0

所以,很自然地(我会说),我在 list_ 上使用 float(...) 并得到:

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

我对 array_ 做同样的事情,这次它通过响应“4.0”来工作。由此,我了解到 Python 的列表不能以这种方式转换为浮点数。

基于 numpy 数组转换为 float 的成功,这让我想到了方法:

float(np.asarray(list_))

这适用于 list_ 既是 Python 列表又是 numpy 数组的情况。

问题

但这种方法似乎有开销,首先将列表转换为 numpy 数组,然后再转换为 float。基本上:有更好的方法吗?

只需访问list/array的第一项,使用索引访问和索引0:

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

这将是一个 int,因为那是您最初插入的内容。如果出于某种原因你需要它是一个浮点数,你可以调用 float() 然后:

>>> float(list_[0])
4.0

我会简单地使用,

np.asarray(input, dtype=np.float)[0]
  • 如果 input 是正确数据类型的 ndarray,则没有开销,因为 np.asarray 在这种情况下什么都不做。
  • 如果 inputlistnp.asarray 确保输出的类型正确。

您可能想要使用 ndarray.item method, as in a.item(). This is also equivalent to (the now deprecated) np.asscalar(a)。这有利于在有视图和多余轴的情况下工作,而上述解决方案目前会失效。例如,

>>> 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])

如果数组实际上不是标量,这也有抛出异常的好处,而 a[0] 方法将静默进行(这可能会导致错误潜入未被发现)。

>>> 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

使用numpy.asscalar将numpy数组/矩阵转换为标量值:

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

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

如果不止一个元素,它已经内置了error-checking:

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

给出:

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

注意:传递给 asscalar 的对象必须响应 item,因此传递列表或元组将不起作用。

np.asscalar(a) 自 NumPy v1.16 起已弃用,请改用 a.item()

例如:

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

给出:

0.6813