【发布时间】:2015-08-05 10:14:22
【问题描述】:
我在 Stack 上找到了一个可以解决我的问题的函数,但现在我想加快我的代码速度,因为我有很多列表要拆分。
我听说对函数进行矢量化是一种解决方案,因此尝试使用 numpy 对我的函数进行矢量化,但它不起作用。
你能帮帮我吗?
原函数:
seq = ([1,1,5,1,5,5,1,5,1,1])
def zigzag(seq):
return seq[::2], seq[1::2]
结果:
([1, 5, 5, 1, 1], [1, 1, 5, 5, 1])
我的矢量化尝试:
import numpy as np
seq = ([1, 1, 5, 1, 5, 5, 1, 5, 1, 1], [2, 2, 2, 3, 3, 3, 3, 2, 2, 2], [6, 3, 9, 2, 9, 4, 6, 3])
def zigzag(seq):
return seq[::2], seq[1::2]
vecto = np.vectorize(zigzag)
vecto(seq)
想要的结果:
(([1, 5, 5, 1, 1], [1, 1, 5, 5, 1]), ([2, 2, 3, 3, 2], [2, 3, 3, 2, 2]), ([6, 9, 9, 6], [3, 2, 4, 3]))
【问题讨论】:
-
你不会从 np.vectorize 中获得太多的加速,基本上它只是在幕后的 for 循环中调用函数。
-
得知这一点我很难过,还有其他解决方案吗?
-
并非如此。如果所有序列的长度相同,则可以创建一个 2D numpy 数组,其中每一行都是一个序列,然后使用矢量化索引为:
return seq[:, ::2], seq[:, 1::2]... 但是,如果您有可变长度序列,则需要遍历他们。您可能会获得的唯一加速是如果您在 Cython 中编写代码(但是当您使用 python 对象、列表/元组时,我怀疑您可以获得任何相关的加速)。
标签: python numpy vectorization