Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 什么是numpy';什么是矢量化?_Pandas_Numpy_Vectorization_Stop Words - Fatal编程技术网

Pandas 什么是numpy';什么是矢量化?

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

我有一个清除一组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().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
加快了速度,但实际上它只是让他们回到了“应该”的状态(这是一种加速)。谢谢你做的时间,以及!