Pandas 什么是numpy';什么是矢量化?
我有一个清除一组stopwords文本的功能:Pandas 什么是numpy';什么是矢量化?,pandas,numpy,vectorization,stop-words,Pandas,Numpy,Vectorization,Stop Words,我有一个清除一组stopwords文本的功能: def clean_text(raw_text, stopwords_set): # removing everything which is not a letter letters_only = re.sub("[^a-zA-Z]", " ", raw_text) # lower case + split --> list of words words = letters_only.lower().spli
def clean_text(raw_text, stopwords_set):
# removing everything which is not a letter
letters_only = re.sub("[^a-zA-Z]", " ", raw_text)
# lower case + split --> list of words
words = letters_only.lower().split()
# now remove the stop words
meaningful_words = [w for w in words if not w in stopwords_set]
# join the remaining words together to get the cleaned tweet
return " ".join(meaningful_words)
在pandas
dataframe中有160万条推特数据集。如果我只是将此函数应用于数据帧,如下所示:
dataframe['clean_text'] = dataframe.apply(
lambda text: clean_text(text, set(stopwords.words('english'))),
axis = 1)
dataframe['clean_text'] = np.vectorize(clean_text)(
dataframe['text'], set(stopwords.words('english')))
计算需要2分钟才能完成(大约)。但是,当我像这样使用np.vectorize
时:
dataframe['clean_text'] = dataframe.apply(
lambda text: clean_text(text, set(stopwords.words('english'))),
axis = 1)
dataframe['clean_text'] = np.vectorize(clean_text)(
dataframe['text'], set(stopwords.words('english')))
计算在10秒(大约)后完成
如果不是两种方法都只在我的机器上使用一个内核,那么这本身就不会令人惊讶。我假设,有了矢量化,它会自动使用多个内核来更快地完成任务,从而获得更快的速度,但它似乎做了一些不同的事情
numpy
's'vectorize`有什么“魔力”我想知道vectorize
是如何处理这些输入的。它的设计目的是获取数组输入,相互广播,并将所有元素作为标量提供给函数。我特别想知道它是如何处理集合的
通过你的功能和一个打印(停止单词)
添加,我得到了
In [98]: words = set('one two three four five'.split())
In [99]: f=np.vectorize(clean_text)
In [100]: f(['this is one line with two words'],words)
{'five', 'four', 'three', 'one', 'two'}
{'five', 'four', 'three', 'one', 'two'}
Out[100]:
array(['this is line with words'],
dtype='<U23')
由于我们不希望向量化函数在第二个参数上迭代,我们真的应该使用excluded
参数。速度差可能可以忽略不计
In [104]: f=np.vectorize(clean_text, excluded=[1])
In [105]: f(['this is one line with two words'],words)
但由于只需迭代一个数组或数据序列,vectorize
只不过是1d迭代或列表理解:
In [111]: text = ['this is one line with two words']
In [112]: [clean_text(t, words) for t in text]
Out[112]: ['this is line with words']
如果我将文本列表加长(10000):
排除
实际上减慢了矢量化
速度;没有它,列表理解和向量化执行相同的操作
因此,如果熊猫
应用
要慢得多,那不是因为矢量化
很神奇。这是因为apply
很慢。再说一遍,你读了np.vectorize
上的文档了吗?它指出-“提供矢量化功能主要是为了方便,而不是为了性能。实现本质上是一个for循环。”
@Divakar这是如何解释加速的?即使有了这些知识,我也看不出这是如何解释加速的,所以这对我还没有帮助。请保持它的建设性,谢谢。你能用for循环版本来计时吗?与numpy数组上的显式循环相比vectorize
通常显示较小的加速比(20%)。但你是在拿它和熊猫做比较。这样使用时,速度可能特别慢。请确保矢量化工作正常。它可能会一次向函数输入一个停止字。检查输出的形状,我明白了apply
速度很慢,vectorize
是“正常”的,所以看起来vectorize
加快了速度,但实际上它只是让他们回到了“应该”的状态(这是一种加速)。谢谢你做的时间,以及!