Python numpy.save()中的Pickle TypeError
我有一个函数来计算特征,然后将特征保存到pickle中Python numpy.save()中的Pickle TypeError,python,multithreading,numpy,Python,Multithreading,Numpy,我有一个函数来计算特征,然后将特征保存到pickle中 test_knn_feats = NNF.predict(X_test) np.save('data/knn_feats_%s_test.npy' % metric , test_knn_feats) 在函数中,如果n_jobs大于1,则将执行下面的代码 fest_feats =[] pool = Pool(processes = self.n_jobs) for i in range(X.shape[0]): test_fe
test_knn_feats = NNF.predict(X_test)
np.save('data/knn_feats_%s_test.npy' % metric , test_knn_feats)
在函数中,如果n_jobs
大于1,则将执行下面的代码
fest_feats =[]
pool = Pool(processes = self.n_jobs)
for i in range(X.shape[0]):
test_feats.append(pool.apply_async(self.get_features_for_one(X[i:i+1])))
pool.close()
pool.join()
return np.vstack(test_feats)
但是,出现以下错误:
TypeError Traceback (most recent call last)
<ipython-input-96-4f707b7cd533> in <module>()
12 print(test_knn_feats)
13 # Dump the features to disk
---> 14 np.save('data/knn_feats_%s_test.npy' % metric , test_knn_feats)
/opt/conda/lib/python3.6/site-packages/numpy/lib/npyio.py in save(file, arr, allow_pickle, fix_imports)
507 arr = np.asanyarray(arr)
508 format.write_array(fid, arr, allow_pickle=allow_pickle,
--> 509 pickle_kwargs=pickle_kwargs)
510 finally:
511 if own_fid:
/opt/conda/lib/python3.6/site-packages/numpy/lib/format.py in write_array(fp, array, version, allow_pickle, pickle_kwargs)
574 if pickle_kwargs is None:
575 pickle_kwargs = {}
--> 576 pickle.dump(array, fp, protocol=2, **pickle_kwargs)
577 elif array.flags.f_contiguous and not array.flags.c_contiguous:
578 if isfileobj(fp):
*更新:
test_feats =[]
pool = Pool(processes = self.n_jobs)
for i in range(X.shape[0]):
test_feats.append(pool.apply_async(self.get_features_for_one, (X[i:i+1],)))
test_feats= [res.get() for res in test_feats]
pool.close()
pool.join()
return np.vstack(test_feats)
这里有两个主要错误:
test_feats =[] # you called it fest_feats, I assume a typo
pool = Pool(processes = self.n_jobs)
for i in range(X.shape[0]):
test_feats.append(pool.apply_async(self.get_features_for_one(X[i:i+1])))
pool.close()
pool.join()
return np.vstack(test_feats)
i
提交一个作业,然后关闭并加入池。您只应在循环结束时在循环外部关闭并加入池一次vstack()
没有任何意义。您需要在每个将来调用get()。例如np.vstack([res.get()表示测试专长中的res])
简而言之,你的问题与你最终从
numpy.save()
收到的类型错误无关——你的问题是你的逻辑完全被破坏了,你的数据不是你想象的那样。什么是test\u knn\u feats.dtype
?多线程与此有什么关系?你是说如果在没有多线程的情况下运行代码就可以工作吗?当我打印它时,它会显示:[[]],[[]]]@JohnZwinck它是object
dtypeah第一点有一个复制粘贴错误。我关闭并加入环路外的游泳池。我将尝试第二点。使用test\u feats=[res.get()获取测试中的res]
进行尝试。由于TypeError:“numpy.ndarray”对象不可调用
,我将花时间进行调试it@MervynLee:您收到新错误是因为您运行的代码不是您发布的代码。停止这样做。我尝试打印res.ready()
,它返回True,但如果我尝试调用res.get()
test_feats =[] # you called it fest_feats, I assume a typo
pool = Pool(processes = self.n_jobs)
for i in range(X.shape[0]):
test_feats.append(pool.apply_async(self.get_features_for_one(X[i:i+1])))
pool.close()
pool.join()
return np.vstack(test_feats)