更新矢量化函数内的 tqdm 进度条
Updating tqdm progress bar inside vectorized function
我有一个具有以下调用签名的函数:
import numpy as np
@np.vectorize
def evolve_system(a0, e0, beta, m1, m2, lt, pbar):
...
pbar.update(1)
...
return
并这样称呼:
from tqdm import tqdm
with tqdm(total=len(df)) as pbar:
n, m, ef, Pf, c = evolve_system(df['a0'].values,
df['e0'].values,
df['beta'].values,
df['m1'].values,
df['m2'].values,
df['lifetime'].values,
pbar
)
其中 df
是一个 pandas DataFrame。在 运行 编译代码时,我收到以下回溯错误:
Traceback (most recent call last):
File "/home/sean/anaconda3/lib/python3.7/site-packages/julia/pseudo_python_cli.py", line 308, in main
python(**vars(ns))
File "/home/sean/anaconda3/lib/python3.7/site-packages/julia/pseudo_python_cli.py", line 59, in python
scope = runpy.run_path(script, run_name="__main__")
File "/home/sean/anaconda3/lib/python3.7/runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "/home/sean/anaconda3/lib/python3.7/runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "/home/sean/anaconda3/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "PhaseSpace.py", line 15, in <module>
df_B = takahe.evolve.period_eccentricity(dataframes_Bray[Z].sample(1000))
File "/home/sean/Documents/takahe/takahe/evolve.py", line 209, in period_eccentricity
pbar
File "/home/sean/.local/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2108, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/home/sean/.local/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2198, in _vectorize_call
for x, t in zip(outputs, otypes)])
File "/home/sean/.local/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2198, in <listcomp>
for x, t in zip(outputs, otypes)])
ValueError: setting an array element with a sequence.
据我所知,这是由于 pbar
参数引起的——因为从定义和调用中省略它会导致代码 运行.
有解决这个问题的干净方法吗?我可以在向量化函数中调用 pbar.update()
吗?
感谢@hpaulj 的建议 - 最简单的解决方案似乎是将 pbar 放在全局范围内并从那里使用它,即
from tqdm import tqdm
import numpy as np
@np.vectorize
def evolve_system(a0, e0, beta, m1, m2, lt):
global pbar
...
pbar.update(1)
...
return
def main():
global pbar
...
with tqdm(total=len(df)) as pbar:
n, m, ef, Pf, c = evolve_system(df['a0'].values,
df['e0'].values,
df['beta'].values,
df['m1'].values,
df['m2'].values,
df['lifetime'].values,
)
我有一个具有以下调用签名的函数:
import numpy as np
@np.vectorize
def evolve_system(a0, e0, beta, m1, m2, lt, pbar):
...
pbar.update(1)
...
return
并这样称呼:
from tqdm import tqdm
with tqdm(total=len(df)) as pbar:
n, m, ef, Pf, c = evolve_system(df['a0'].values,
df['e0'].values,
df['beta'].values,
df['m1'].values,
df['m2'].values,
df['lifetime'].values,
pbar
)
其中 df
是一个 pandas DataFrame。在 运行 编译代码时,我收到以下回溯错误:
Traceback (most recent call last):
File "/home/sean/anaconda3/lib/python3.7/site-packages/julia/pseudo_python_cli.py", line 308, in main
python(**vars(ns))
File "/home/sean/anaconda3/lib/python3.7/site-packages/julia/pseudo_python_cli.py", line 59, in python
scope = runpy.run_path(script, run_name="__main__")
File "/home/sean/anaconda3/lib/python3.7/runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "/home/sean/anaconda3/lib/python3.7/runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "/home/sean/anaconda3/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "PhaseSpace.py", line 15, in <module>
df_B = takahe.evolve.period_eccentricity(dataframes_Bray[Z].sample(1000))
File "/home/sean/Documents/takahe/takahe/evolve.py", line 209, in period_eccentricity
pbar
File "/home/sean/.local/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2108, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/home/sean/.local/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2198, in _vectorize_call
for x, t in zip(outputs, otypes)])
File "/home/sean/.local/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2198, in <listcomp>
for x, t in zip(outputs, otypes)])
ValueError: setting an array element with a sequence.
据我所知,这是由于 pbar
参数引起的——因为从定义和调用中省略它会导致代码 运行.
有解决这个问题的干净方法吗?我可以在向量化函数中调用 pbar.update()
吗?
感谢@hpaulj 的建议 - 最简单的解决方案似乎是将 pbar 放在全局范围内并从那里使用它,即
from tqdm import tqdm
import numpy as np
@np.vectorize
def evolve_system(a0, e0, beta, m1, m2, lt):
global pbar
...
pbar.update(1)
...
return
def main():
global pbar
...
with tqdm(total=len(df)) as pbar:
n, m, ef, Pf, c = evolve_system(df['a0'].values,
df['e0'].values,
df['beta'].values,
df['m1'].values,
df['m2'].values,
df['lifetime'].values,
)