如何在Python函数中将元素添加到NumPy数组

我正在尝试使用具有多处理模块的工作程序池从文本文件创建一系列NumPy数组。

EmailAuthProvider

问题是在def process_line(line,x,y,z,t): sl = line.split() x = np.append(x,float(sl[0].replace(',',''))) y = np.append(y,float(sl[1].replace(',''))) z = np.append(z,float(sl[2].replace(',''))) t = np.append(t,float(sl[3].replace(',''))) def txt_to_HDF_converter(name,path_file): #init objects x = np.empty(0) y = np.empty(0) z = np.empty(0) t = np.empty(0) pool = mp.Pool(4) jobs = [] with open(path_file) as f: for line in f: jobs.append(pool.apply_async(process_line,(line,t))) #wait for all jobs to finish for job in jobs: job.get() #clean up pool.close() 函数中分配数组时出现的,就像参数通过值传递一样,在循环结束时,我最终得到的数组只有一个元素。 知道如何解决这个问题吗?

fkpy123 回答:如何在Python函数中将元素添加到NumPy数组

您正在将值作为元组的一部分传递到代码中:

        jobs.append(pool.apply_async(process_line,(line,x,y,z,t)))

然后,您可以在函数中隐式解压缩该元组:

def process_line(line,t):

然后,您不更改现有值,而是使用以下几行来创建新值:

    x = np.append(x,float(sl[0].replace(',','')))
    y = np.append(y,float(sl[1].replace(','')))
    z = np.append(z,float(sl[2].replace(','')))
    t = np.append(t,float(sl[3].replace(','')))

让我重复一遍:不要更改原始数组(如您所期望的那样)。取而代之的是,您只是使用旧值来创建新值,然后将它们分配给局部变量xyzt 。然后,您离开该函数,而忽略了新值。我会说这在函数之外永远不会有任何影响(也不会影响最后一个值)。

您有几种解决方法。

  1. 使用全局变量。这是一个快速解决方案,但风格不好,从长远来看,您会讨厌我的建议。但是,如果您只需要它快速运行,那么这可能是您的选择。

  2. 返回您的值。创建新值后,以某种方式返回它们,并确保下一次调用再次获得先前返回的值作为输入。这是功能方法。

  3. 通过引用传递您的值。您可以通过传递而不是x创建一个单元素列表来做到这一点。请参阅以下代码,了解如何执行此操作。传递引用是典型的C风格编程,但不是Python风格的(但可以)。许多IDE会警告您这样做的方式,而典型的Python开发人员将很难理解您在这里所做的事情。更好的选择是不使用简单列表,而是将数据放入将通过引用传递的某种对象。

x_ref = [x]
y_ref = [y]
y_ref = [y]
t_ref = [t]

with open(path_file) as f:
    for line in f:
        jobs.append(pool.apply_async(process_line,x_ref,y_ref,z_ref,t_ref)))

然后process_line也需要进行调整以期望引用:

def process_line(line,t_ref):
    sl = line.split()
    x_ref[0] = np.append(x_ref[0],'')))
    y_ref[0] = np.append(y_ref[0],'')))
    z_ref[0] = np.append(z_ref[0],'')))
    t_ref[0] = np.append(t_ref[0],'')))
本文链接:https://www.f2er.com/3169479.html

大家都在问