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

时间:2015-05-18 19:16:22

标签: python arrays list numpy floating-point

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

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

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

list_ = [4]

或numpy数组:

array_ = array([4])

我应该回来

 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数组然后浮动。基本上:有更好的方法吗?

5 个答案:

答案 0 :(得分:20)

只需使用索引访问和索引0:

访问列表/数组的第一项
>>> list_ = [4]
>>> list_[0]
4
>>> array_ = np.array([4])
>>> array_[0]
4

这将是int,因为这是您首先插入的内容。如果由于某种原因需要它是浮点数,你可以在它上面调用float()

>>> float(list_[0])
4.0

答案 1 :(得分:12)

您可能希望使用a.item()方法,例如>>> 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]) 。这也相当于ndarray.item。这有利于在具有视图和多余轴的情况下工作,而上述解决方案目前将破裂。例如,

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 方法将默默进行(这可能导致漏洞未被发现)。

{{1}}

答案 2 :(得分:5)

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

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

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

如果存在多个元素,则内置错误检查:

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

给出:

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

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

答案 3 :(得分:2)

我会简单地使用,

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

答案 4 :(得分:2)

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

例如:

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

给出:

0.6813