Numpy平均值不适用于贴图对象



我有一个数组,它包含表示数字的字符串。

a = ["101", "102", "103"]

我想取这个数组的平均值,所以我尝试将每个元素映射到float中,然后使用np.average

>>> np.average(map(float, a))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 5, in average
File "C:UsersalonsoAppDataLocalProgramsPythonPython39libsite-packagesnumpylibfunction_base.py", line 380, in average
avg = a.mean(axis)
File "C:UsersalonsoAppDataLocalProgramsPythonPython39libsite-packagesnumpycore_methods.py", line 190, in _mean
ret = ret / rcount
TypeError: unsupported operand type(s) for /: 'map' and 'int'

如果我通过迭代来转换数字,它是有效的,但如果我必须使用迭代,这就违背了映射的目的。

np.average([float(i) for i in a])
102.0

Map返回一个地图对象

map(float, a)
<map object at 0x0000022E46035D60>

但是,看起来python不知道如何用int来划分map。

如果我将地图转换为列表,那么它就工作了,它不会创建地图列表,而是评估地图值并创建浮动列表

list(map(float, a))
[101.0, 102.0, 103.0]

然而,将映射转换为数组则不然。

np.array(map(float, a))
array(<map object at 0x0000022E2D4A84F0>, dtype=object)

np.average(np.array(map(float, a)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 5, in average
File "C:UsersalonsoAppDataLocalProgramsPythonPython39libsite-packagesnumpylibfunction_base.py", line 380, in average
avg = a.mean(axis)
File "C:UsersalonsoAppDataLocalProgramsPythonPython39libsite-packagesnumpycore_methods.py", line 190, in _mean
ret = ret / rcount
TypeError: unsupported operand type(s) for /: 'map' and 'int'
>>>

为什么会发生这种情况?我是遗漏了什么还是numpy的实现限制?

在我看来,如果我将某个东西映射到float中,那么在取平均值之前,我必须将它们显式地转换为列表,np.average不应该已经处理了吗?

忘记map吧。它的可读性很差,而且很少有用。列表理解和生成器表达式已使其过时。

至于为什么它不起作用:Map在Python-3中返回一个迭代器对象。它曾经是Python-2中的一个列表,这就是为什么它在过去可能有效的原因。然而,numpy通常不会优雅地处理迭代器。使用np.fromiter(map(float, a), dtype=float)np.array(list(map(float, a)))

在Python3中,map停止返回列表对象,因此如果您想要一个新列表,而不仅仅是要迭代的内容,则需要list(map(float, mylist)[float(i) for i in lst]

相关内容

最新更新