【发布时间】:2019-09-05 02:03:01
【问题描述】:
我正在使用np.vectorize-ed 函数,并希望通过tqdm 查看函数的进度。但是,我无法弄清楚如何做到这一点。
我发现的所有建议都与将计算转换为 for 循环或转换为 pd.DataFrame 相关。
【问题讨论】:
-
你为什么使用
np.vectorize?
我正在使用np.vectorize-ed 函数,并希望通过tqdm 查看函数的进度。但是,我无法弄清楚如何做到这一点。
我发现的所有建议都与将计算转换为 for 循环或转换为 pd.DataFrame 相关。
【问题讨论】:
np.vectorize?
据我所知,tqdm 不会覆盖numpy.vectorize。
要显示numpy数组的进度条,可以使用numpy.ndenumerate。
给定输入和功能:
import numpy as np
from tqdm import tqdm
a = np.array([1, 2, 3, 4])
b = 2
def myfunc(a, b):
"Return a-b if a>b, otherwise return a+b"
if a > b:
return a - b
else:
return a + b
替换下面的这个矢量化部分
# using numpy.vectorize
vfunc = np.vectorize(myfunc)
vfunc(a, b)
有了这个
# using numpy.ndenumerate instead
[myfunc(x,b) for index, x in tqdm(np.ndenumerate(a))]
查看tqdm 的进度。
【讨论】:
for-loop,我知道该怎么做。我希望让tqdm 与np.vectorize 一起工作。此外,我尝试了您的方法,我注意到时间差异很大。这是因为日志记录还是因为您的方法不使用np.vectorize?例如:np_vectorized_sum timing: 0:00:00.005858 和 np_ndenumerate_sum timing: 0:00:02.856294(总和超过 100 x 100 网格)
np.vectorize中使用了SIMD。
我终于找到了一种方法,可以让 tqdm 进度条使用 np.vectorize 函数进行更新。我使用 with 包装了矢量化函数
with tqdm(total=len(my_inputs)) as pbar:
my_output = np.vectorize(my_function)(my_inputs)
在 my_function() 中添加以下行
global pbar
pbar.update(1)
瞧!我现在有一个进度条,每次迭代都会更新。我的代码只有轻微的性能下降。
注意:当您实例化该函数时,它可能会抱怨 pbar 尚未定义。只需在实例化之前加上一个pbar = 0,然后函数就会调用with定义的pbar
希望对阅读这里的每个人都有帮助。
【讨论】:
progress_bar.update(1) AttributeError: 'int' object has no attribute 'update'
my_input 是一个矩阵。我用total=my_input.size
根据@Carl Kirstein 的回答,我想出了以下解决方案。我将 pbar 元素作为参数添加到 my_function,并在函数内部对其进行了更新。
with tqdm(total=len(my_inputs)) as pbar:
my_output = np.vectorize(my_function)(my_inputs, pbar)
在my_function 里面的某处我在某处添加了pbar.update(1)。
def my_function(args, pbar):
...
pbar.update(1)
...
【讨论】: