Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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
Python numpy.save()中的Pickle TypeError_Python_Multithreading_Numpy - Fatal编程技术网

Python numpy.save()中的Pickle TypeError

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

我有一个函数来计算特征,然后将特征保存到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_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)