【问题标题】:mutliprocessing TypeError: 'float' object is not iterable多处理类型错误:“浮动”对象不可迭代
【发布时间】:2021-09-28 17:05:21
【问题描述】:

我尝试使用多重处理将位置绘制到地图中,因为可能有很多位置可能需要一些时间,而且我经常不得不稍微调整一下想法,然后再试一次。

Traceback (most recent call last):
  File "C:\Users\tbade\Documents\Studium\Master_thesis\Python\map.py", line 39, in <module>
    pool.starmap(multiprocessing_func, zip(pop_lon, pop_lat))
  File "C:\ProgramData\Anaconda3\envs\Python\lib\multiprocessing\pool.py", line 372, in starmap
    return self._map_async(func, iterable, starmapstar, chunksize).get()
  File "C:\ProgramData\Anaconda3\envs\Python\lib\multiprocessing\pool.py", line 771, in get
    raise self._value
TypeError: 'float' object is not iterable

这是我收到的错误消息

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.feature as cf
import pandas as pd
import numpy as np
import multiprocessing

df = pd.read_csv('passport.csv')

pop_lat = df['latitude'].tolist()[:-2]
pop_lon = df['longitude'].tolist()[:-2]

central_lat, central_lon = np.median(pop_lat), np.median(pop_lon)
extent = [central_lon - 3, central_lon + 3.4, central_lat - 2.2, central_lat + 2]
ax = plt.axes(projection=ccrs.AlbersEqualArea(central_lon, central_lat))
ax.set_extent(extent)
ax.add_feature(cf.COASTLINE)
ax.add_feature(cf.BORDERS)
plt.show()

def multiprocessing_func(lon, lat):
    for x, y in zip(lon, lat):
        ax.plot(x, y, 'bo', markersize=1, transform=ccrs.Geodetic())


if __name__ == '__main__':
    with multiprocessing.Pool() as pool:
        pool.starmap(multiprocessing_func, zip(pop_lon, pop_lat))

我也得到了多个数字

提前致谢

【问题讨论】:

  • pop_latpop_lon 似乎都是浮点数列表。这意味着 multiprocessing_func 的参数是两个浮点数,而不是两个浮点数列表。因此你的错误。目前尚不清楚您要通过多处理实现什么目标。
  • 这个任务用 MRE 会更好(我们没有你的 passport.csv)。它也可能会让你更清楚发生了什么
  • 我还应该补充一点,我不知道当您在不同线程中多次调用plot 时会发生什么。我不知道这是否受支持,以及您是否要获得多个地块或一个地块。我再说一遍,您要并行化其中的哪一部分。

标签: python multiprocessing cartopy


【解决方案1】:

这不是一个解决方案,因为不清楚您究竟想要并行化什么,正如@FrankYellin 在 cmets 中提到的那样。这只是对问题的解释,评论太多了。

您实现multiprocessing_func 的方式,它隐含地期望两个可迭代对象latlon,因为您试图zip 它们,而您只能zip 可迭代对象。

但是您对starmap 调用所做的是将浮点数配对成元组,然后将这些浮点数(starmap 中的“星”)解包为multiprocessing_func 的参数。由于您没有提供示例数据,以下是 starmap 工作原理的演示:

In [1]: from itertools import starmap

In [2]: def adder(a, b):
   ...:     print(a, b)
   ...:     return a + b
   ...:

In [3]: list(starmap(adder, zip([1, 2, 3, 4, 5], [5, 2, 1, 6, 2])))
1 5
2 2
3 1
4 6
5 2
Out[3]: [6, 4, 4, 10, 7]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2023-03-09
    • 2014-03-16
    • 1970-01-01
    • 2011-08-27
    • 2017-03-05
    • 2013-06-13
    • 2021-03-02
    相关资源
    最近更新 更多