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

den*_*var 22 python arrays floating-point numpy list

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

在任何一种情况下,列表/数组都有一个元素(总是).我只需要返回一个浮点数.

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

list_ = [4]
Run Code Online (Sandbox Code Playgroud)

或numpy数组:

array_ = array([4])
Run Code Online (Sandbox Code Playgroud)

我应该回来

 4.0
Run Code Online (Sandbox Code Playgroud)

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

TypeError: float() argument must be a string or a number
Run Code Online (Sandbox Code Playgroud)

我对array_做同样的事情,这次它通过响应"4.0"来工作.由此,我了解到Python的列表无法以这种方式转换为float.

基于numpy数组转换为float的成功,这引出了我的方法:

float(np.asarray(list_))
Run Code Online (Sandbox Code Playgroud)

当list_既是Python列表又是numpy数组时,这种方法也适用.

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

pok*_*oke 24

只需使用索引访问和索引0访问列表/数组的第一项:

>>> list_ = [4]
>>> list_[0]
4
>>> array_ = np.array([4])
>>> array_[0]
4
Run Code Online (Sandbox Code Playgroud)

这将是int您从一开始就插入的内容.如果由于某种原因需要它是浮点数,那么你可以调用float()它:

>>> float(list_[0])
4.0
Run Code Online (Sandbox Code Playgroud)


Aar*_*ker 17

您可能想要使用该ndarray.item方法,如a.item().这也相当于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])
Run Code Online (Sandbox Code Playgroud)

如果数组不是单例,这也有抛出异常的好处,而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
Run Code Online (Sandbox Code Playgroud)


Tom*_*ale 6

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

>>> a=numpy.array([[[[42]]]])
>>> numpy.asscalar(a)
42
Run Code Online (Sandbox Code Playgroud)

输出数据类型与输入item方法返回的类型相同。

它内置了错误检查功能,以检查是否有多个元素:

>>> a=numpy.array([1, 2])
>>> numpy.asscalar(a)
Run Code Online (Sandbox Code Playgroud)

给出:

ValueError: can only convert an array of size 1 to a Python scalar
Run Code Online (Sandbox Code Playgroud)

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

  • 自版本 1.16 起已弃用:已弃用,请使用 numpy.ndarray.item() 代替。 (2认同)