缩短Python程序
我有22个文件具有相同的字段/列名。我使用PyFit加载它们,例如:缩短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个文件的表数据
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