缩短Python程序

缩短Python程序,python,Python,我有22个文件具有相同的字段/列名。我使用PyFit加载它们,例如: hdulist1 = pyfits.open('/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo1.fits') hdulist2 = pyfits.open('/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo2.fits') 然后我加载22个文件的表数据

我有22个文件具有相同的字段/列名。我使用PyFit加载它们,例如:

hdulist1 = pyfits.open('/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo1.fits')
hdulist2 = pyfits.open('/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo2.fits')
然后我加载22个文件的表数据

tbdata1 = hdulist1[1].data
tbdata2 = hdulist2[1].data
因为所有的字段名都是相同的,所以我说

fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
并将变量从1到22(var1、var2等)分配给如下字段:

var1 = dict((f, tbdata1.field(f)) for f in fields)
var2 = dict((f, tbdata2.field(f)) for f in fields)
现在,我使用np.histogram查找22个文件的一些值:

N_1, r_hist_1 = np.histogram(var1['r'], bins=20, range=None, normed=False, weights=None)
N_2, r_hist_2 = np.histogram(var2['r'], bins=20, range=None, normed=False, weights=None)
dist_1 = r_hist_1[1]
area_1 = [math.pi*(R**2-r**2) for R, r in zip(dist_1[1:], dist_1)]
sigma_num_1 = N_1/area_1
现在,我使用公式找出不同文件的变量sigma_num_1和sigma_num_2的值,同样:

N_1, r_hist_1 = np.histogram(var1['r'], bins=20, range=None, normed=False, weights=None)
N_2, r_hist_2 = np.histogram(var2['r'], bins=20, range=None, normed=False, weights=None)
dist_1 = r_hist_1[1]
area_1 = [math.pi*(R**2-r**2) for R, r in zip(dist_1[1:], dist_1)]
sigma_num_1 = N_1/area_1
代码运行良好,并给出了sigma_num_1、sigma_num_2等的结果

我不想为22个文件中的每一个都写上面三行来查找sigma_num_3到sigma_num_22。
有办法吗。找到sigma的所有22个值后,我需要找到所有这22个值的平均值。

使用嵌套字典,为其分配22个键,并将每个数据点作为子字典存储在主字典中

e、 g


使用嵌套字典,为其分配22个键,并将每个数据点作为子字典存储在主字典中

e、 g

使用列表和循环

hdulist = []
fits_path= '/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo%i.fits'
for number in range(1,23):
    hdulist.append(pyfits.open(fits_path % number)
tbdata = [hdu[1].data for hdu in hdulist]
等等。

使用列表和循环

hdulist = []
fits_path= '/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo%i.fits'
for number in range(1,23):
    hdulist.append(pyfits.open(fits_path % number)
tbdata = [hdu[1].data for hdu in hdulist]

等等。

您不需要为每个值指定一个变量名。您可以使用来存储所有值,同时提供一种方便的方法来引用每个值。诀窍是提取在同一类型变量的不同出现之间发生变化的部分,例如,
hdulist1
hdulist2
之间有什么不同

例如,您可以创建
hdulist
s,方法是将它们放入一个列表中,并使用
format
字符串方法形成每个
open
语句:

hdulists = []
for n in range(1, 23):   # range is exclusive so you get 1-22
    hdulists.append(
        pyfits.open(
            ('/home/ssridhar/mock_test_files/Roncarelli_test'
            '/roncarelli_dist_halo{0}.fits').format(n)
        )
     )
这也可以在列表中完成:

hdulists = [pyfits.open(
                ('/home/ssridhar/mock_test_files/Roncarelli_test'
                '/roncarelli_dist_halo{0}.fits').format(n)
            ) for n in range(1, 23)]
现在,您需要记住的唯一一件事是python列表从索引0开始,因此您将引用以前的
hdulist1
作为
hdulists[0]
,依此类推

但是你可以变得更聪明,在一个函数中一次完成所有这些步骤,这个函数将返回你想要的结果。然后为每个
.fits
文件运行该函数

def sigma_num(n):
    fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
    hdulist = pyfits.open(
                  ('/home/ssridhar/mock_test_files/Roncarelli_test'
                  '/roncarelli_dist_halo{0}.fits').format(n)
              )
    var = dict((f, hdulist[1].data.field(f)) for f in fields)
    N, r_hist = np.histogram(var['r'], bins=20, range=None, normed=False, weights=None)
    area = [math.pi*(R**2-r**2) for R, r in zip(r_hist[1:], r_hist)]
    return N/area
现在您可以调用
sigma\u num(3)
sigma\u num(22)
来获取您过去所称的
sigma\u num\u 3
sigma\u num\u 22

要找到平均值,您可以使用我之前介绍的迭代范围的技术:

sigma_nums = []
for n in range(1, 23):
    sigma_nums.append(sigma_num(n))
avg_sigma_num = sum(sigma_nums)/len(sigma_nums)
sum
len
是。您还可以将上述内容抽象为一个列表理解,或者更好的是,一个函数

编辑:由于您要求单独提供
tbdata
s,请将该函数的该部分分离为一个助手函数。
sigma_num
可以调用helper函数:

def tbdata(n):
    """ helper function """
    hdulist = pyfits.open(
                  ('/home/ssridhar/mock_test_files/Roncarelli_test'
                  '/roncarelli_dist_halo{0}.fits').format(n)
              )
    return hdulist[1].data

def sigma_num(n):
    fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
    tbdata = tbdata(n)
    var = dict((f, tbdata.field(f)) for f in fields)
    N, r_hist = np.histogram(var['r'], bins=20, range=None, normed=False, weights=None)
    area = [math.pi*(R**2-r**2) for R, r in zip(r_hist[1:], r_hist)]
    return N/area

您不需要为每个值指定一个变量名。您可以使用来存储所有值,同时提供一种方便的方法来引用每个值。诀窍是提取在同一类型变量的不同出现之间发生变化的部分,例如,
hdulist1
hdulist2
之间有什么不同

例如,您可以创建
hdulist
s,方法是将它们放入一个列表中,并使用
format
字符串方法形成每个
open
语句:

hdulists = []
for n in range(1, 23):   # range is exclusive so you get 1-22
    hdulists.append(
        pyfits.open(
            ('/home/ssridhar/mock_test_files/Roncarelli_test'
            '/roncarelli_dist_halo{0}.fits').format(n)
        )
     )
这也可以在列表中完成:

hdulists = [pyfits.open(
                ('/home/ssridhar/mock_test_files/Roncarelli_test'
                '/roncarelli_dist_halo{0}.fits').format(n)
            ) for n in range(1, 23)]
现在,您需要记住的唯一一件事是python列表从索引0开始,因此您将引用以前的
hdulist1
作为
hdulists[0]
,依此类推

但是你可以变得更聪明,在一个函数中一次完成所有这些步骤,这个函数将返回你想要的结果。然后为每个
.fits
文件运行该函数

def sigma_num(n):
    fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
    hdulist = pyfits.open(
                  ('/home/ssridhar/mock_test_files/Roncarelli_test'
                  '/roncarelli_dist_halo{0}.fits').format(n)
              )
    var = dict((f, hdulist[1].data.field(f)) for f in fields)
    N, r_hist = np.histogram(var['r'], bins=20, range=None, normed=False, weights=None)
    area = [math.pi*(R**2-r**2) for R, r in zip(r_hist[1:], r_hist)]
    return N/area
现在您可以调用
sigma\u num(3)
sigma\u num(22)
来获取您过去所称的
sigma\u num\u 3
sigma\u num\u 22

要找到平均值,您可以使用我之前介绍的迭代范围的技术:

sigma_nums = []
for n in range(1, 23):
    sigma_nums.append(sigma_num(n))
avg_sigma_num = sum(sigma_nums)/len(sigma_nums)
sum
len
是。您还可以将上述内容抽象为一个列表理解,或者更好的是,一个函数

编辑:由于您要求单独提供
tbdata
s,请将该函数的该部分分离为一个助手函数。
sigma_num
可以调用helper函数:

def tbdata(n):
    """ helper function """
    hdulist = pyfits.open(
                  ('/home/ssridhar/mock_test_files/Roncarelli_test'
                  '/roncarelli_dist_halo{0}.fits').format(n)
              )
    return hdulist[1].data

def sigma_num(n):
    fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
    tbdata = tbdata(n)
    var = dict((f, tbdata.field(f)) for f in fields)
    N, r_hist = np.histogram(var['r'], bins=20, range=None, normed=False, weights=None)
    area = [math.pi*(R**2-r**2) for R, r in zip(r_hist[1:], r_hist)]
    return N/area

基本上,对于要计算“sigma”的每个文件。因此,您可以创建一个函数,将file作为参数,并返回“sigma”

您可以将所有文件存储在一个列表中,并在循环列表时调用此函数。您可以将“sigmas”存储在另一个列表中。比如:

>>> def sigma(file):
...     pass
... 
>>> files = ["a", "b"]
>>> sigmas = []
>>> for f in files:
...     sigmas.append(sigma(f)
... 
>>> sigmas
[None, None]

基本上,对于要计算“sigma”的每个文件。因此,您可以创建一个函数,将file作为参数,并返回“sigma”

您可以将所有文件存储在一个列表中,并在循环列表时调用此函数。您可以将“sigmas”存储在另一个列表中。比如:

>>> def sigma(file):
...     pass
... 
>>> files = ["a", "b"]
>>> sigmas = []
>>> for f in files:
...     sigmas.append(sigma(f)
... 
>>> sigmas
[None, None]

首先,创建一个函数来处理单个文件并计算其sigma

def find_sigma(n):
    fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
    hdulist = pyfits.open('/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo%d.fits' % n)
    tbdata = hdulist[1].data
    var = dict((f, tbdata.field(f)) for f in fields)
    N, r_hist = np.histogram(var['r'], bins=20, range=None, normed=False, weights=None)
    dist = r_hist[1]
    area = [math.pi*(R**2-r**2) for R, r in zip(dist[1:], dist)]
    sigma_num = N/area

    return sigma_num
然后简单地使用列表理解来找到平均值:

average_sigma = sum([find_sigma(i) for i in range(1, 23)]) / 23.0

首先,创建一个函数来处理单个文件并计算其sigma

def find_sigma(n):
    fields = ['ra','dec','zcosmo','r200','m200','is_central','r']
    hdulist = pyfits.open('/home/ssridhar/mock_test_files/Roncarelli_test/roncarelli_dist_halo%d.fits' % n)
    tbdata = hdulist[1].data
    var = dict((f, tbdata.field(f)) for f in fields)
    N, r_hist = np.histogram(var['r'], bins=20, range=None, normed=False, weights=None)
    dist = r_hist[1]
    area = [math.pi*(R**2-r**2) for R, r in zip(dist[1:], dist)]
    sigma_num = N/area

    return sigma_num
然后简单地使用列表理解来找到平均值:

average_sigma = sum([find_sigma(i) for i in range(1, 23)]) / 23.0

考虑创建一个输入文件列表。你知道函数是什么吗?但我不知道如何使用函数来缩短this@devnull你能解释更多吗?考虑创建一个输入文件的列表。你知道什么是函数吗?@黑熊是的。但我不知道如何使用函数来缩短this@devnull你能再解释一下吗?你能再解释一下吗?如果所有的键都被简单地命名为
somestring\un]
,其中
[n]
是一个计数器,那么把数据放在dict中是没有任何意义的-你可以使用一个列表。@DhruvPathak现在我该如何访问f