Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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数组中_Python_Pass By Reference_Numpy Ndarray - Fatal编程技术网

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

如何在Python函数中将元素添加到NumPy数组中,python,pass-by-reference,numpy-ndarray,Python,Pass By Reference,Numpy Ndarray,我正在尝试从文本文件中创建一系列NumPy数组,使用一组具有多处理模块的工作线程 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(',','')))

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

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,x,y,z,t)))

#wait for all jobs to finish
for job in jobs:
    job.get()
#clean up
pool.close()
当在
process\u line
函数中分配数组时,问题就出现了,就像在循环结束时通过值传递参数一样,我最终得到的数组只有一个元素。
您知道如何解决这个问题吗?

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

        jobs.append(pool.apply_async(process_line,(line,x,y,z,t)))
然后在函数中隐式解压缩此元组:

def process_line(line, x,y,z,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(',','')))
让我重复一下:您不会更改原始数组(正如您所期望的那样)。相反,您只需使用旧值创建新值,然后将其分配给局部变量
x
y
z
t
。然后离开函数,忘记新值。我想说,这在函数之外永远不会有任何影响(也不会对最后一个值产生影响)

你有几个选择来解决这个问题

  • 使用全局变量。这是一个快速修复,但不好的风格,从长远来看,你会恨我的建议。但是,如果您只是需要它快速工作,那么这可能是您的选择

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

  • 通过引用传递您的值。您可以通过传递
    x
    创建一个单元素列表来完成此操作。有关如何执行此操作,请参见下面的代码。传递引用是典型的C风格编程,不太符合Python(但它可以工作)。很多IDE都会警告您这样做,典型的Python开发人员很难理解您在那里做什么。一个更好的变体不是使用简单的列表,而是将数据放入某种类型的对象中,这些对象将通过引用传递

  • 然后,还需要调整
    流程行
    ,以期望引用:

    def process_line(line, x_ref,y_ref,z_ref,t_ref):
        sl = line.split()
        x_ref[0] = np.append(x_ref[0],float(sl[0].replace(',','')))
        y_ref[0] = np.append(y_ref[0],float(sl[1].replace(',','')))
        z_ref[0] = np.append(z_ref[0],float(sl[2].replace(',','')))
        t_ref[0] = np.append(t_ref[0],float(sl[3].replace(',','')))
    

    你确定工人是线程吗?如果它们是进程,那么它们各自在自己的数据结构上工作,最后(加入时)您必须在master中收集它们的所有结果。Hello@Alfe,在这一点上,我刚刚删除了多处理部分,并使用任何工作线程或线程运行调用函数的代码(进程行(行,x,y,z,t))数组在每次迭代中仍然没有增长,它只是附加最后一个值。
    def process_line(line, x_ref,y_ref,z_ref,t_ref):
        sl = line.split()
        x_ref[0] = np.append(x_ref[0],float(sl[0].replace(',','')))
        y_ref[0] = np.append(y_ref[0],float(sl[1].replace(',','')))
        z_ref[0] = np.append(z_ref[0],float(sl[2].replace(',','')))
        t_ref[0] = np.append(t_ref[0],float(sl[3].replace(',','')))