Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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中矢量化多维函数_Python_Arrays_Optimization_Numpy_Vectorization - Fatal编程技术网

在Python中矢量化多维函数

在Python中矢量化多维函数,python,arrays,optimization,numpy,vectorization,Python,Arrays,Optimization,Numpy,Vectorization,一段时间以来,我经常潜伏在堆栈溢出上,每当我遇到编码问题时,我都会从这里找到非常有用和清晰的信息。然而,我似乎真的找不到一条线索来解决我今天的具体问题 今天早些时候,我学习了用Python对函数进行矢量化以加快计算速度。我目前正在尝试优化一个多月前编写的python程序。我的程序采用包含以下格式数据的文本文件: 然后,我将每列分配给列表mag、dmag和expnum 我想做的是创建一个2d数组,其中包含mag和dmag值,它们共享相同的expnum(具有相同的曝光编号意味着mag和dmag指向

一段时间以来,我经常潜伏在堆栈溢出上,每当我遇到编码问题时,我都会从这里找到非常有用和清晰的信息。然而,我似乎真的找不到一条线索来解决我今天的具体问题

今天早些时候,我学习了用Python对函数进行矢量化以加快计算速度。我目前正在尝试优化一个多月前编写的python程序。我的程序采用包含以下格式数据的文本文件:

然后,我将每列分配给列表
mag
dmag
expnum

我想做的是创建一个2d数组,其中包含
mag
dmag
值,它们共享相同的
expnum
(具有相同的曝光编号意味着
mag
dmag
指向相同的数据点)

我对所有曝光数都这样做,最后,我取
mag
dmag
的中值,以及每个基于曝光数的阵列的
mag
的标准偏差,并将它们组合成一个我可以绘制的阵列

目前,我有以下代码:

从numpy导入loadtxt、数组、asarray、append、std、median、empty、take
data=loadtxt(infle,usecols=(0,1,2))
mag=data1[:,2].tolist()
dmag=data1[:,3].tolist()
expnum=data1[:,4].tolist()
#初始化变量
索引=列表()
master_mag=list()
master_dmag=list()
sub_mag=列表()
sub_dmag=list()
mag_std=阵列([])
mag_stdmed=阵列([])
mag_med=阵列([])
当len(mag)>0时:
num=expnum[0]
对于范围(0,len(expnum))中的i:
如果expnum[i]==num:
附属杂志附加(杂志[i])
sub_dmag.append(dmag[i])
索引。追加(i)
#将子列表添加到其主列表中
主磁贴附(副磁贴)
主标记追加(子标记)
sub_mag=列表()
sub_dmag=list()
#从mag、dmag和expnum中删除索引所引用的索引
而len(索引)>0:
mag.pop(索引[-1])
dmag.pop(索引[-1])
expnum.pop(索引[-1])
索引.pop()
#将主mag和dmag列表制作成numpy阵列
master\u mag=阵列(master\u mag)
master\U dmag=asarray(master\U dmag)
#生成mag和dmag中值和mag std阵列
对于范围(0,len(master_mag))内的i:
mag_std=附加(mag_std,std(mag_mag[i]))
mag_-med=附加(mag_-med,中间值(master_-mag[i]))
mag_标准差=附加(mag_标准差,中间值(主标准差[i]))
#创建用于mag med与mag std的空numpy阵列
#和mag med vs.dmag med
med_标准=空([0,2])
med_dmed=空([0,2])
#填写这些数组
对于范围(0,len(mag_std))内的i:
med_标准=附加(med_标准,[[mag_标准[i],mag_标准[i]],轴=0)
med_-dmed=append(med_-dmed,[[mag_-med[i],mag_-stdmed[i]],axis=0)
#按中值mag对中值mag和dmag标准偏差阵列进行排序
order\u med\u std=med\u std[:,0]。argsort()
order\u med\u dmed=med\u dmed[:,0]。argsort()
排序的标准=接受(标准,顺序标准,0)
已排序的\u med\u dmed=接受(med\u dmed,order\u med\u dmed,0)
然后我准备绘制
sorted\u-med\u-dmed[:,0]
vs.
sorted\u-med\u-dmed[:,1]
sorted\u-med\u-std[:,0]
vs.
sorted\u-med\u-std[:,1]

这段代码很有效,只是我觉得太慢了(特别是当我需要处理10000多个数据点时)。我想尝试和矢量化这段代码,使它更快,但我不知道从哪里开始

我想得到一些帮助,弄清楚如何通过曝光数分量矢量化匹配。一开始我想创建一个多维数组,它的格式是:
数组([[[mag],[dmag]],…])
,长度等于不同曝光次数的数量。有没有一种方法可以在线生成和更新这样的数组,而不必使用大量循环

请让我知道,如果你需要任何进一步的明确这段代码到底在做什么


谢谢您的时间。

任何此类问题的第一步都应该是分析。我建议尝试一下,因为这样可以很容易地在视觉上找到热点。(您也可以尝试Python的内置分析器,但我发现它的输出更难解析。)

这应该能让您了解哪些部分是代码最慢的部分。不必亲自尝试,我可以提供一些建议:

  • 当numpy数组足够时,尽量避免使用Python列表。如果要执行大量的
    append
    s操作,则列表速度很快,但对于大多数其他操作,列表速度很慢,并且不支持矢量化
  • 相关地,尽量避免调用
    numpy.append
    ,如果可以的话。每次调用都涉及分配更多内存和复制,这在循环中可能非常慢
  • 使用字典按键对数据进行分组。我发现stdlib
    collections.defaultdict
    对于这样的分组非常有用:

    groups = defaultdict(list)
    for a,b,key in data:
      groups[key].append((a,b))
    
  • 使用numpy的自动矢量化函数调用,而不是在循环中调用函数。例如,此代码:

    #generate the mag and dmag median and mag std arrays 
    for i in range(0,len(master_mag)): 
      mag_std=append(mag_std,std(master_mag[i])) 
      mag_med=append(mag_med,median(master_mag[i])) 
      mag_stdmed=append(mag_stdmed,median(master_dmag[i]))
    
    当写为以下内容时,速度会快得多:

    mag_std = numpy.std(master_mag, axis=0)
    mag_meg = numpy.median(master_mag, axis=0)
    mag_stdmed = numpy.median(master_dmag, axis=0)
    

很难准确计算出您要执行的计算。如果你用方程形式med_dmed=…,那么很可能相应的numpy表达式会非常相似。@Iggy我想你需要更详细地解释你到底想做什么。有一种更好的方法可以更快地执行循环,您可以通过使用
多处理
来优化代码的速度。您可以查看并找出如何在此框架中重新编写代码。