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