我有一个可以接受列表或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数组然后浮动。基本上:有更好的方法吗?
答案 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
在这种情况下什么都不做。input
是list
,np.asarray
会确保输出的类型正确。答案 4 :(得分:2)
np.asscalar(a)
自 NumPy v1.16 起已弃用,请改用 a.item()
。
例如:
a = np.array([[0.6813]])
print(a.item())
给出:
0.6813