将单个元素的列表或 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
在这种情况下什么都不做。
- 如果
input
是 list
,np.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
我有一个函数可以接受列表或 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
在这种情况下什么都不做。 - 如果
input
是list
,np.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