【问题标题】:Convert list or numpy array of single element to float in python将单个元素的列表或numpy数组转换为python中的浮点数
【发布时间】:2015-07-30 10:16:25
【问题描述】:

我有一个可以接受列表或 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的列表不能以这种方式转换为float。

基于成功将 numpy 数组转换为浮点数,这导致我采用这种方法:

float(np.asarray(list_))

当 list_ 既是 Python 列表又是 numpy 数组时,此方法有效。

问题

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

【问题讨论】:

  • 你不能使用切片吗:float(list_[0]) = 4.0
  • float(list_[0])float(''.join(list_))

标签: python arrays list numpy floating-point


【解决方案1】:

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

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

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

>>> float(list_[0])
4.0

【讨论】:

    【解决方案2】:

    我会简单地使用,

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

    【讨论】:

      【解决方案3】:

      您可能想要使用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])
      

      如果数组实际上不是标量,这也有抛出异常的好处,而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
      

      【讨论】:

        【解决方案4】:

        使用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,因此传递列表或元组将不起作用。

        【讨论】:

        • 自 1.16 版后已弃用:已弃用,请改用 numpy.ndarray.item()。
        【解决方案5】:

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

        例如:

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

        给予:

        0.6813
        

        【讨论】:

          猜你喜欢
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          • 2013-03-23
          • 2021-12-28
          相关资源
          最近更新 更多