我正在尝试矢量化创建一个数组,该数组具有随循环变量而变化的变量索引。在下面的代码片段中,我希望删除for循环并对数组创建进行矢量化。有人能帮忙吗?
#矢量化1
def abc(x):
return str(x)+'_variable'
ar = []
for i in range(0,100):
ar += [str('vectorize_')+abc(i)]
您不会从";矢量化";不幸的是,因为你在处理字符串。由于这个限制,一个纯粹的Python理解能力几乎是你所能得到的"矢量化的";只有当数据是数字时,操作才能利用优化的数字C代码。
这里有一个你可以在这里做你想做的事情的方法的例子:
In [4]: %timeit np.char.add(np.repeat("vectorize_variable_", 100), np.arange(100).astype(str))
108 µs ± 1.79 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
与纯粹的Python理解:
In [5]: %timeit [f"vectorize_variable_{i}" for i in range(100)]
11.1 µs ± 175 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
据我所知,在处理字符串时,使用numpy并不能带来任何性能优势。当然,我可能错了,如果我错了,我会很高兴的。
如果你仍然不相信,下面是n=10000
:的相同测试
In [6]: %timeit [f"vectorize_variable_{i}" for i in range(n)]
1.21 ms ± 23.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [7]: %timeit np.char.add(np.repeat("vectorize_variable_", n), np.arange(n).astype(str)
...: )
9.97 ms ± 40.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
纯Python的速度大约是"Python"的10倍;矢量化的";版本