我想写一个函数在几个python引擎中执行。该函数接受pandas Series作为参数。该系列的每个元素都是一个字符串,整个系列构成了TF的语料库。IDF计算。
在阅读了IPython并行文档和一些教程之后,这似乎很容易做到,我想到了以下内容:
import pandas as pd
from IPython.parallel import Client
def calculemus(corpus):
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=1, stop_words='english')
return vectorizer.fit_transform(corpus)
review = pd.read_csv('review.csv')['text']
review = review.fillna('')
client = Client()
r = client[-1].apply(calculemus, review).get()
但是我得到了这个错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)/xxx/site-packages/IPython/zmq/serialize.pyc in unpack_apply_message(bufs, g, copy)
154 sa.data = m.bytes
155
--> 156 args = uncanSequence(map(unserialize, sargs), g)
157 kwargs = {}
158 for k in sorted(skwargs.iterkeys()):
/xxx/site-packages/IPython/utils/newserialized.pyc in unserialize(serialized)
175
176 def unserialize(serialized):
--> 177 return UnSerializeIt(serialized).getObject()
/xxx/site-packages/IPython/utils/newserialized.pyc in getObject(self)
159 buf = self.serialized.getData()
160 if isinstance(buf, (bytes, buffer, memoryview)):
--> 161 result = numpy.frombuffer(buf, dtype = self.serialized.metadata['dtype'])
162 else:
163 raise TypeError("Expected bytes or buffer/memoryview, but got %r"%type(buf))
ValueError: cannot create an OBJECT array from memory buffer
我不知道是什么问题,有人能指点我一下吗?
很明显,这个错误说的就是它说的。如果我这样做:
r = client[-1].apply(calculemus, np.array(review, dtype=str)).get()
有点用。
那么下一个问题是,这是ippython的特性还是限制?
标题>这是ippython 0.13中的一个错误,应该在master中修复。序列化numpy数组有一种特殊情况,可以避免复制数据,这种行为是由isinstance(numpy.ndarray)
检查触发的。这是不合适的,因为isinstance
捕获子类,其中包括pandas对象,但是这些pandas对象(以及一般的数组子类)不应该以相同的方式处理,因为元数据将丢失,并且另一端的重构通常会失败。
r = client[-1].apply(calculemus, np.array(review, dtype=str)).get()
等价于
r = client[-1].apply_sync(calculemus, np.array(review, dtype=str))