我已经在这里就这个相同的主题提出了几个问题,但我真的不想让我正在研究的教授失望。这是我第一次使用Python,我可能已经有点过头了。
无论如何,我被发送了一个文件来阅读并能够使用这个命令:
SNdata = numpy.genfromtxt('...', dtype=None,
usecols (0,6,7,8,9,19,24,29,31,33,34,37,39,40,41,42,43,44),
names ['sn','off1','dir1','off2','dir2','type','gal','dist',
'htype','d1','d2','pa','ai','b','berr','b0','k','kerr'])
sn
只是一个特定超新星名称的数组; type
是超新星类型的数组(Ia或II)等。
我需要做的第一件事就是根据SN类型(Ia或II)计算某些属性的概率。
例如,列htype
是星系的形态(给定为整数1 =椭圆形到8 =不规则)。我需要计算给定TypeIa和椭圆给定TypeII的椭圆的概率,所有整数最多为8。
对于椭圆机,我知道我只需要htype = 1 and type = Ia
除以type = Ia
元素总数的元素数量。然后将htype = 1 and type = II
的元素数除以具有type = II
的元素总数。
我根本不知道如何为此编写代码。我计划首先找到每种类型的总数,然后运行for循环以查找给定htype
(Ia或II)的某个type
元素的数量。
有人可以帮助我开始这个吗?如果需要澄清,请告诉我。
非常感谢。
答案 0 :(得分:4)
Numpy支持布尔数组操作,这将使您的代码编写起来相当简单。例如,您可以这样做:
htype_sums = {}
for htype_number in xrange(1,9):
htype_mask = SNdata.htype == htype_number
Ia_mask = SNdata.type == 'Ia'
II_mask = SNdata.type == 'II'
Ia_sum = (htype_mask & Ia_mask).sum() / Ia_mask.sum()
II_sum = (htype_mask & II_mask).sum() / II_mask.sum()
htype_sums[htype_number] = (Ia_sum, II_sum)
每个_mask
变量都是布尔数组,所以当你对它们求和时,你会计算True
的元素数。
答案 1 :(得分:1)
您可以使用collections.Counter
来计算所需的观察结果。
例如,
from collections import Counter
types_counter = Counter(row['type'] for row in data)
会为您提供所需的sn types
计数。
htypes_types_counter = Counter((row['type'], row['htype']) for row in data)
计算形态和类型。然后,为了得到椭圆机的评估,只需划分
1.0*htypes_types_counter['Ia', 1]/types_counter['Ia']